Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.
Defines the composition to render: dimensions, output format, timeline elements,
and optional transitions. The render engine produces a single video artifact.
Wire version of this request. Omit it: the render task is v5 exactly when the request carries a v5 block, and v4 otherwise. v5 accepts the v5 blocks (a shape's geometry, frame and instance elements, operations, components); v4 refuses them.
Transform groups over member elements (compose member→group→parent; optional stack layout), the alias of frames (§5). A request with frame or instance elements carries none.
The logical root in design px: frames and instances at the root are placed in this box, and the render scales it uniformly to width x height, whose aspect it must have. Canvas percent at the root is unchanged.
Shutter-based motion blur over the whole composition (§5c). Graphics motion smears; video holds its decoded frame within the shutter (as in AE). Opt-in and costly: accumulation is CPU-side, so the render falls back to software encoding — expect roughly samples× render time.
Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS linear-gradient(...) string.
Inline custom-animation definitions (§3), registered with the engine before any element is built. Reference an element entry by name via motion[].custom on any video/image/shape element or group; reference a text entry via a text element's animation_preset or motion[].custom. The catalog stops being a ceiling — anything expressible as keyframes is expressible in the request.
Controls handling of video/audio source URLs that are not hosted by Framelane. When true (the default), each such file is probed for its duration before rendering: the job starts in the ingesting state and moves to queued once the probe answers, so elements may omit out_point. The file itself is fetched by the renderer at render time, so the URL must be a direct, public https link to the media (not a share page) that supports range requests. When false, the URL is passed straight through and video/audio require an explicit out_point.
Example:
true
Response
Idempotent replay — same Idempotency-Key reused.
A freshly submitted render: the job row plus the advisory lint of its composition.
Returned only by the two submit routes (POST /v1/renders,
POST /v1/projects/{id}/renders). A subclass rather than two more fields on
:class:JobOut, because JobOut is the shape of a job row on every read route
(GET /v1/renders, all /v1/tasks routes, the MCP read tools) where a lint
result does not exist and would be permanently null.
Advisory — the render was still accepted and dispatched. False means the composition has error-severity findings that will likely make the output wrong (a self-transition, a fully off-canvas element); it does NOT mean the submission was refused. Everything that actually blocks a render is a 422 before you ever see this field.
Structured JSON result for tasks that return data rather than a file — transcribe returns the transcript here (text, words, utterances, and any requested analysis). Populated once status == completed; null for renders and for any job whose only artifact is the file at output.url.
Example:
{ "language_code": "en", "text": "Welcome back to the show." }
Advisory — the render was still accepted and dispatched. Cross-element and layout findings from the same linter the preview dry-run runs, attached so you can see problems on the render you just paid for instead of only in the artifact. To catch these BEFORE spending a render, call POST /v1/preview with dry_run.Truncated to the first 36 findings (errors first) on very large compositions, with a VIOLATIONS_TRUNCATED marker carrying the full count; the free dry run is never truncated.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Framelane","colors":{"primary":"#0070f3","light":"#3b82f6","dark":"#1d4ed8"},"logo":{"light":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-light.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a819adfb6e5b9a97575f20c034d41c77","dark":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-dark.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=14e93bd67dd1fedf3c655cbebd17e046"},"favicon":"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/favicon.ico?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a0cbeea069121bb5f6014ae0b57c8b8b","api":{"playground":{"display":"interactive"}},"navbar":{"links":[{"href":"https://console.framelane.io","label":"Console"}],"primary":{"type":"button","label":"Get API Key","href":"https://console.framelane.io/signup"}},"footer":{"socials":{"x":"https://twitter.com/framelane","github":"https://github.com/framelane"}},"seo":{"metatags":{"og:type":"website","og:site_name":"Framelane","og:image":"https://cdn-assets.framelane.io/shared/images/og-docs.png","robots":"index, follow"},"indexing":"all"},"contextual":{"options":["copy","view","claude","chatgpt","download-spec"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/framelane"},{"anchor":"Status","icon":"signal-bars","href":"https://status.framelane.io"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"itis-c7dc7146","hasAudioNarration":false,"actualSubdomain":"itis-c7dc7146","customDomains":["docs.framelane.io"],"gitSource":{"type":"github","owner":"itishq","repo":"framelane-api","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf86d0737ceb5e7109b3ae","collectionId":"43553988-d245-46c7-9e69-6860d4cdb8de","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf86d0737ceb5e7109b3ae"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adf86d0737ceb5e7109b3ae","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API Reference","count":65},{"language":"default","tag":"Documentation","count":41},{"language":"default","tag":"Webhooks","count":13},{"language":"default","tag":"Projects","count":10},{"language":"default","tag":"Renders","count":10},{"language":"default","tag":"Get Started","count":9},{"language":"default","tag":"Render Examples","count":9},{"language":"default","tag":"Account","count":9},{"language":"default","tag":"Guides","count":7},{"language":"default","tag":"Tasks","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/renders/submit-a-render-job","slug":"/api-reference/renders/submit-a-render-job","pageMetadata":{"title":"Submit a render job","description":"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY `ok` + `violations[]` lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/renders","href":"/api-reference/renders/submit-a-render-job","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY \", _jsx(_components.code, {\n children: \"ok\"\n }), \" + \", _jsx(_components.code, {\n children: \"violations[]\"\n }), \" lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Submit a render job","description":"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY `ok` + `violations[]` lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/renders","href":"/api-reference/renders/submit-a-render-job","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["renders"],"summary":"Submit a render job","description":"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY `ok` + `violations[]` lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.","operationId":"create_render","security":["d4cf0361-3beb-4284-bf49-b5e629e110b2"],"parameters":["009500fd-d9e2-40e2-99d9-b40a6b94076a"],"requestBody":"a4b63e18-a6e5-4a28-a959-4cd4d7235920","responses":{"200":"9641a20c-d860-487e-b5a5-e294af2899bc","202":"42bbb933-a945-4c8d-a876-1c76d2c8c0aa","401":"aa221757-5c49-4dc5-a8a5-eff5d1421684","402":"6ebbd611-182b-4e9c-b591-330d0199956a","409":"20486bf1-caf4-4e88-9cac-6cc438f0abdb","422":"934b8e3d-f210-4719-9644-df7937c98cd7","429":"a882a748-ca2e-4510-b299-beeb04d39616"},"method":"post","type":"path","servers":["374e059c-6af0-4c50-a102-7400af30babb"],"path":"/v1/renders","baseUrlOptions":["https://api.framelane.io"],"title":"Submit a render job","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"009500fd-d9e2-40e2-99d9-b40a6b94076a":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"oneOf":[{"type":"string","title":"Idempotency-Key","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"Idempotency-Key","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"version":{"oneOf":[{"type":"string","title":"Version","description":"Wire version of this request. Omit it: the render task is v5 exactly when the request carries a v5 block, and v4 otherwise. `v5` accepts the v5 blocks (a shape's `geometry`, `frame` and `instance` elements, `operations`, `components`); `v4` refuses them.","enum":["v4","v5"],"example":"v5","uniqueKey":"version.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Version","description":"Wire version of this request. Omit it: the render task is v5 exactly when the request carries a v5 block, and v4 otherwise. `v5` accepts the v5 blocks (a shape's `geometry`, `frame` and `instance` elements, `operations`, `components`); `v4` refuses them.","example":"v5","uniqueKey":"version.oneOf.1","typeLabel":"null"}],"uniqueKey":"version","typeLabel":"enum\u003cstring> | null"},"schema_version":{"oneOf":[{"type":"string","title":"Schema Version","description":"The document format an editor wrote this request in. Not sent to the renderer; `version` is the wire's.","const":"v5","example":"v5","uniqueKey":"schema_version.oneOf.0","typeLabel":"string"},{"type":"null","title":"Schema Version","description":"The document format an editor wrote this request in. Not sent to the renderer; `version` is the wire's.","example":"v5","uniqueKey":"schema_version.oneOf.1","typeLabel":"null"}],"uniqueKey":"schema_version","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Output width in pixels. Must be set together with `height` or both omitted.","maximum":8192,"minimum":16,"example":1920,"uniqueKey":"width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Output width in pixels. Must be set together with `height` or both omitted.","example":1920,"uniqueKey":"width.oneOf.1","typeLabel":"null"}],"uniqueKey":"width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Output height in pixels. Must be set together with `width` or both omitted.","maximum":8192,"minimum":16,"example":1080,"uniqueKey":"height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Output height in pixels. Must be set together with `width` or both omitted.","example":1080,"uniqueKey":"height.oneOf.1","typeLabel":"null"}],"uniqueKey":"height","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Total composition duration in seconds. Inferred from elements when omitted.","minimum":0,"example":15,"exclusiveMinimum":true,"uniqueKey":"duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Total composition duration in seconds. Inferred from elements when omitted.","example":15,"uniqueKey":"duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"duration","typeLabel":"number | null"},"frame_rate":{"oneOf":[{"type":"integer","title":"Frame Rate","description":"Frames per second. When set, the output encodes at exactly this rate. Defaults to 30 when omitted.","maximum":240,"minimum":1,"example":30,"uniqueKey":"frame_rate.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Frame Rate","description":"Frames per second. When set, the output encodes at exactly this rate. Defaults to 30 when omitted.","example":30,"uniqueKey":"frame_rate.oneOf.1","typeLabel":"null"}],"uniqueKey":"frame_rate","typeLabel":"integer | null"},"output_format":{"type":"string","enum":["mp4","webm","mov","gif","png","jpg"],"title":"OutputFormat","description":"Container and codec for the output file.","x-enumDescriptions":{"mp4":"H.264 MP4 video — the default, widely compatible delivery format.","webm":"VP9 WebM video — supports a transparent (alpha) background.","mov":"QuickTime MOV — ProRes 4444 with a transparent (alpha) background; large files.","gif":"Animated GIF — roadmap; not yet emitted by the renderer.","png":"Single-frame PNG still — roadmap; not yet emitted by the renderer.","jpg":"Single-frame JPEG still — roadmap; not yet emitted by the renderer."},"default":"mp4","example":"mp4","uniqueKey":"output_format","typeLabel":"enum\u003cstring>"},"output_filename":{"oneOf":[{"type":"string","title":"Output Filename","description":"Custom filename for the artifact (without extension). Auto-generated when omitted.","example":"my-render","uniqueKey":"output_filename.oneOf.0","typeLabel":"string"},{"type":"null","title":"Output Filename","description":"Custom filename for the artifact (without extension). Auto-generated when omitted.","example":"my-render","uniqueKey":"output_filename.oneOf.1","typeLabel":"null"}],"uniqueKey":"output_filename","typeLabel":"string | null"},"background_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Background Color","description":"RGBA background color in hex format (#RRGGBBAA).","default":"#000000ff","example":"#000000ff","uniqueKey":"background_color","typeLabel":"string"},"background_image_url":{"oneOf":[{"type":"string","title":"Background Image Url","description":"URL of an image to use as the composition background.","format":"uri","maxLength":2083,"minLength":1,"example":"https://cdn.example.com/bg.jpg","uniqueKey":"background_image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Background Image Url","description":"URL of an image to use as the composition background.","example":"https://cdn.example.com/bg.jpg","uniqueKey":"background_image_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"background_image_url","typeLabel":"string\u003curi> | null"},"alpha":{"type":"boolean","title":"Alpha","description":"When true, produce an alpha-channel (transparent background) output. Requires `output_format=webm` or `output_format=mov`.","default":false,"example":false,"uniqueKey":"alpha","typeLabel":"boolean"},"elements":{"items":{"oneOf":[{"type":"object","title":"VideoElement","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"integer","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"number"},{"type":"string","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.x","typeLabel":"integer | number | string"},"y":{"oneOf":[{"type":"integer","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.0.y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.y","typeLabel":"integer | number | string"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.0.width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.width","typeLabel":"integer | number | string"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"number"},{"type":"string","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.0.height.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.height","typeLabel":"integer | number | string"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"elements.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"elements.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"elements.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.0","typeLabel":"VideoElement · object"},{"type":"object","title":"AudioElement","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the audio file. Must be accessible by the renderer.","example":"https://cdn.example.com/music.mp3","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.1.source_url","typeLabel":"string\u003curi>"},"type":{"type":"string","const":"audio","title":"Type","default":"audio","uniqueKey":"elements.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element. Audio has no picture — `false` drops the whole track from the render, it does not mute or hide it (the linter reports that as `AUDIO_HIDDEN`). To keep the track but silence it, set `muted: true`.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start from. Defaults to `0`.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":30,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.1.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop. Defaults to end of source when omitted. Controls clip length on the timeline.","example":30,"uniqueKey":"elements.items.[INDEX].oneOf.1.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.1.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× speed.","default":1,"example":1,"uniqueKey":"elements.items.[INDEX].oneOf.1.speed","typeLabel":"number"},"volume":{"type":"number","maximum":100,"exclusiveMinimum":0,"title":"Volume","description":"Audio volume as a percentage (1–100). **Must be greater than 0** — the renderer silently drops audio streams with `volume \u003c= 0`. Use `muted` to silence the track.","default":100,"example":100,"uniqueKey":"elements.items.[INDEX].oneOf.1.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence this track while keeping it, and its `volume`, in the composition. A muted track is left out of the render's audio.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.1.muted","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.1.fade_out_duration","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.1","typeLabel":"AudioElement · object"},{"type":"object","title":"TextElement","required":["duration","text"],"properties":{"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"**Required.** Duration in seconds the text is visible. Omitting this field produces a zero-length window and the element will not appear in the render.","example":5,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.duration","typeLabel":"number"},"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"integer","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"number"},{"type":"string","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.x","typeLabel":"integer | number | string"},"y":{"oneOf":[{"type":"integer","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.2.y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.y","typeLabel":"integer | number | string"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.2.width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.width","typeLabel":"integer | number | string"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"number"},{"type":"string","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.2.height.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.height","typeLabel":"integer | number | string"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"elements.items.[INDEX].oneOf.2.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.2.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.2.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"elements.items.[INDEX].oneOf.2.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"elements.items.[INDEX].oneOf.2.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"elements.items.[INDEX].oneOf.2.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"elements.items.[INDEX].oneOf.2.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"elements.items.[INDEX].oneOf.2.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"elements.items.[INDEX].oneOf.2.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"elements.items.[INDEX].oneOf.2.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.2.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"elements.items.[INDEX].oneOf.2.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.2.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.2.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.2.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"elements.items.[INDEX].oneOf.2.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.2.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"elements.items.[INDEX].oneOf.2.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"elements.items.[INDEX].oneOf.2.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.2.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.2.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.2.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"elements.items.[INDEX].oneOf.2.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"elements.items.[INDEX].oneOf.2.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.2.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.2.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.2.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.2","typeLabel":"TextElement · object"},{"type":"object","title":"ImageElement","required":["id","duration","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.id","typeLabel":"string"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"**Required.** Duration in seconds the image is visible. Omitting this field produces a zero-length window and the image will not appear in the render.","example":5,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.duration","typeLabel":"number"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.3.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.3.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.3.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.3.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"integer","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"number"},{"type":"string","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.x","typeLabel":"integer | number | string"},"y":{"oneOf":[{"type":"integer","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.3.y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.y","typeLabel":"integer | number | string"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.3.width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.width","typeLabel":"integer | number | string"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"number"},{"type":"string","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.3.height.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.height","typeLabel":"integer | number | string"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"elements.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.3","typeLabel":"ImageElement · object"},{"type":"object","title":"ShapeElement","description":"A first-class vector primitive: SVG path fill + stroke, morphing (§5b).","required":["id","duration"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.id","typeLabel":"string"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"**Required.** Seconds the shape is visible.","example":4,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.duration","typeLabel":"number"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.4.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.4.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.4.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"integer","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.x.oneOf.1","typeLabel":"number"},{"type":"string","title":"X","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.x","typeLabel":"integer | number | string"},"y":{"oneOf":[{"type":"integer","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.4.y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.y","typeLabel":"integer | number | string"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.4.width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.4.width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Width","description":"Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.","default":"100%","example":"40%","uniqueKey":"elements.items.[INDEX].oneOf.4.width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.width","typeLabel":"integer | number | string"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.4.height.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.4.height.oneOf.1","typeLabel":"number"},{"type":"string","title":"Height","description":"Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.","default":"100%","example":"80%","uniqueKey":"elements.items.[INDEX].oneOf.4.height.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.height","typeLabel":"integer | number | string"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.4.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.4.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.","default":"50%","example":"0%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.","default":"50%","example":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.4.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.4.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.4.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.4.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.","uniqueKey":"elements.items.[INDEX].oneOf.4.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.4.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.4.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"elements.items.[INDEX].oneOf.4.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.4.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.4.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.4.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.locked","typeLabel":"boolean"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.4.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.4.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"elements.items.[INDEX].oneOf.4.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"elements.items.[INDEX].oneOf.4.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"elements.items.[INDEX].oneOf.4.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.4.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"elements.items.[INDEX].oneOf.4.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"elements.items.[INDEX].oneOf.4.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.4.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.4.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.4.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.4.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.4","typeLabel":"ShapeElement · object"},{"type":"object","title":"FrameElement","description":"A frame (render-node AEC §5): elements nested in its box, with its own clip, mask,\nmatte, blend, effects and, as a composite, its own clock. Its children use design px\nfrom its top-left corner, frames and instances included.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique in the request; operations, mattes and anchors name it.","example":"card","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.id","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"elements.items.[INDEX].oneOf.5.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.5.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"elements.items.[INDEX].oneOf.5.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"elements.items.[INDEX].oneOf.5.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"elements.items.[INDEX].oneOf.5.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"elements.items.[INDEX].oneOf.5.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"elements.items.[INDEX].oneOf.5.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"elements.items.[INDEX].oneOf.5.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"elements.items.[INDEX].oneOf.5.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"frame","title":"Type","default":"frame","uniqueKey":"elements.items.[INDEX].oneOf.5.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on its parent's clock (the composition's at the root). Omitted: its parent's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on its parent's clock (the composition's at the root). Omitted: its parent's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.locked","typeLabel":"boolean"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: its parent's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: its parent's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: its parent's height.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: its parent's height.","uniqueKey":"elements.items.[INDEX].oneOf.5.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.height","typeLabel":"number | null"},"slot":{"oneOf":[{"type":"string","title":"Slot","description":"In a component body: the slot name an instance's `slots` fill in place of this frame's own children.","minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.slot.oneOf.0","typeLabel":"string"},{"type":"null","title":"Slot","description":"In a component body: the slot name an instance's `slots` fill in place of this frame's own children.","uniqueKey":"elements.items.[INDEX].oneOf.5.slot.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.slot","typeLabel":"string | null"},"children":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{"type":"object","title":"InstanceElement","description":"An instance (render-node AEC §5g): a placed copy of a `components` definition. Its box\nis the component's (or its variant's); it sets the component's properties, fills its\nslots, and places, times and composites itself as a frame does.","required":["id","time","component"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Its content's ids become `\u003cid>/\u003cchild id>`.","example":"card1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.id","typeLabel":"string"},"time":{"type":"number","minimum":0,"title":"Time","description":"**Required.** Start in seconds on its parent's clock; every time inside the component counts from it.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time","typeLabel":"number"},"component":{"type":"string","minLength":1,"title":"Component","description":"The `components` entry it places.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.component","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"instance","title":"Type","default":"instance","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.track","typeLabel":"integer | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.locked","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","title":"Variant","description":"The variant by name. Omitted: the first.","minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.variant.oneOf.0","typeLabel":"string"},{"type":"null","title":"Variant","description":"The variant by name. Omitted: the first.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.variant","typeLabel":"string | null"},"properties":{"additionalProperties":{"oneOf":[{"type":"boolean","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.0","typeLabel":"boolean"},{"type":"integer","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.1","typeLabel":"integer"},{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.2","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.3","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties.additionalProperties","typeLabel":"boolean | integer | number | string"},"type":"object","title":"Properties","description":"Values of the component's declared properties, by name, each of its type.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.properties","typeLabel":"Properties · object"},"slots":{"additionalProperties":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"type":"any","title":"Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"any"},"bold":{"type":"any","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"any"},"italic":{"type":"any","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"any"},"underline":{"type":"any","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"type":"any","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"any"},"smoothing":{"type":"any","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"type":"any","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"any"},"y1":{"type":"any","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"any"},"x2":{"type":"any","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"any"},"y2":{"type":"any","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"any"},"inner_ratio_percent":{"type":"any","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"any"},"start_angle":{"type":"any","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"any"},"sweep":{"type":"any","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"any"},"sweep_percent":{"type":"any","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"any"},"cap":{"type":"any","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"any"},"segments":{"type":"any","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"any"},"inner_ratio_percent":{"type":"any","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"any"},"start_angle":{"type":"any","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"any"},"sweep":{"type":"any","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"any"},"sweep_percent":{"type":"any","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"any"},"cap":{"type":"any","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"any"},"segments":{"type":"any","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"type":"any","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"any"},"corner_radius":{"type":"any","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"type":"any","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"any"},"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"any"},"corner_radius":{"type":"any","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"type":"any","title":"Type","description":"Omitted: `drop`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"any"},"x":{"type":"any","title":"X","description":"Horizontal offset in px.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"any"},"y":{"type":"any","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"any"},"blur":{"type":"any","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"any"},"spread":{"type":"any","title":"Spread","description":"Spread in px.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"type":"any","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object"},"type":"array","uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots.additionalProperties","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[]"},"type":"object","title":"Slots","description":"Content for the component's slots, by slot name, in place of the slot frame's own children.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5.slots","typeLabel":"Slots · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX].oneOf.5","typeLabel":"InstanceElement · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.5.children.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | InstanceElement · object"},"type":"array","title":"Children","description":"The elements inside, in design px from this frame's top-left corner; frames and instances nest. Audio stays at the root.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.5.children","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | InstanceElement · object)[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.5","typeLabel":"FrameElement · object"},{"type":"object","title":"InstanceElement","description":"An instance (render-node AEC §5g): a placed copy of a `components` definition. Its box\nis the component's (or its variant's); it sets the component's properties, fills its\nslots, and places, times and composites itself as a frame does.","required":["id","time","component"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Its content's ids become `\u003cid>/\u003cchild id>`.","example":"card1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.id","typeLabel":"string"},"time":{"type":"number","minimum":0,"title":"Time","description":"**Required.** Start in seconds on its parent's clock; every time inside the component counts from it.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.time","typeLabel":"number"},"component":{"type":"string","minLength":1,"title":"Component","description":"The `components` entry it places.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.component","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.6.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"elements.items.[INDEX].oneOf.6.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"elements.items.[INDEX].oneOf.6.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"elements.items.[INDEX].oneOf.6.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.6.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.6.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"elements.items.[INDEX].oneOf.6.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"elements.items.[INDEX].oneOf.6.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"elements.items.[INDEX].oneOf.6.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.6.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"elements.items.[INDEX].oneOf.6.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"elements.items.[INDEX].oneOf.6.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.6.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"elements.items.[INDEX].oneOf.6.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.6.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"elements.items.[INDEX].oneOf.6.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"elements.items.[INDEX].oneOf.6.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"elements.items.[INDEX].oneOf.6.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"instance","title":"Type","default":"instance","uniqueKey":"elements.items.[INDEX].oneOf.6.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.track","typeLabel":"integer | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.locked","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","title":"Variant","description":"The variant by name. Omitted: the first.","minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.variant.oneOf.0","typeLabel":"string"},{"type":"null","title":"Variant","description":"The variant by name. Omitted: the first.","uniqueKey":"elements.items.[INDEX].oneOf.6.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.variant","typeLabel":"string | null"},"properties":{"additionalProperties":{"oneOf":[{"type":"boolean","uniqueKey":"elements.items.[INDEX].oneOf.6.properties.additionalProperties.oneOf.0","typeLabel":"boolean"},{"type":"integer","uniqueKey":"elements.items.[INDEX].oneOf.6.properties.additionalProperties.oneOf.1","typeLabel":"integer"},{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.properties.additionalProperties.oneOf.2","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.6.properties.additionalProperties.oneOf.3","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.properties.additionalProperties","typeLabel":"boolean | integer | number | string"},"type":"object","title":"Properties","description":"Values of the component's declared properties, by name, each of its type.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.properties","typeLabel":"Properties · object"},"slots":{"additionalProperties":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{}],"uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object"},"type":"array","uniqueKey":"elements.items.[INDEX].oneOf.6.slots.additionalProperties","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[]"},"type":"object","title":"Slots","description":"Content for the component's slots, by slot name, in place of the slot frame's own children.","default":{},"uniqueKey":"elements.items.[INDEX].oneOf.6.slots","typeLabel":"Slots · object"}},"additionalProperties":false,"uniqueKey":"elements.items.[INDEX].oneOf.6","typeLabel":"InstanceElement · object"}],"uniqueKey":"elements.items.[INDEX]","typeLabel":"VideoElement · object | AudioElement · object | TextElement · object | ImageElement · object | ShapeElement · object | FrameElement · object | InstanceElement · object"},"type":"array","title":"Elements","description":"Ordered list of timeline elements (video, image, text, audio, etc.).","uniqueKey":"elements","typeLabel":"(VideoElement · object | AudioElement · object | TextElement · object | ImageElement · object | ShapeElement · object | FrameElement · object | InstanceElement · object)[]"},"transitions":{"items":{"properties":{"type":{"type":"string","enum":["cross_dissolve","dip_to_black","dip_to_white","wipe_left","wipe_right","wipe_up","wipe_down","diagonal_wipe","barn_doors_horizontal","barn_doors_vertical","iris","page_turn","cross_zoom","gradient_wipe","band_wipe","box_wipe","swirl","glitch_memories","window_slice","cube","doorway","pinwheel","water_drop","crosshatch","dreamy","angular","burn","heart","circle_open","color_phase","squares_wire","whip_pan","cinematic_zoom","burn_edge","shatter","domain_warp","circle_crop","cross_warp","fold_horizontal","fold_vertical","linear_blur","minimise_bottom_left","minimise_bottom_right","minimise_top_left","minimise_top_right","ripple","rotate","splice","three_stripes"],"title":"TransitionType","description":"Transition effect applied between two video elements (transitions are video-only).","x-enumDescriptions":{"cross_dissolve":"Cross-dissolve — fades one clip into the next.","dip_to_black":"Dips through black between clips.","dip_to_white":"Dips through white between clips.","wipe_left":"Wipes the next clip in from the right to the left.","wipe_right":"Wipes the next clip in from the left to the right.","wipe_up":"Wipes the next clip in from the bottom upward.","wipe_down":"Wipes the next clip in from the top downward.","diagonal_wipe":"Wipes across on a diagonal split.","barn_doors_horizontal":"Two halves part horizontally like barn doors.","barn_doors_vertical":"Two halves part vertically like barn doors.","iris":"Circular iris (bullseye) open/close between clips.","page_turn":"Page-flip / page-curl reveal.","cross_zoom":"Zoom-blur push from one clip into the next.","gradient_wipe":"Soft gradient-driven dissolve wipe.","band_wipe":"Interleaved stripes wipe the next clip in.","box_wipe":"Rectangular box grows to reveal the next clip.","swirl":"Swirls the outgoing clip away in a spiral.","glitch_memories":"Glitchy, memory-like distortion between clips.","window_slice":"Slices the frame into sliding window strips.","cube":"3D cube rotation between the two clips.","doorway":"Clips part like opening doors to reveal the next.","pinwheel":"Pinwheel rotation wipe between clips.","water_drop":"Rippling water-drop distortion reveals the next clip.","crosshatch":"Crosshatch pattern dissolve between clips.","dreamy":"Soft, dreamy blur-dissolve between clips.","angular":"Angular wedge sweep between clips.","burn":"Burning-film dissolve between clips.","heart":"Heart-shaped iris reveal of the next clip.","circle_open":"Expanding circle opens onto the next clip.","color_phase":"Color-phase shift blends between clips.","squares_wire":"Wireframe squares wipe between clips.","whip_pan":"Directional motion-blur whip pan.","cinematic_zoom":"Punch zoom with radial blur + chromatic fringing.","burn_edge":"Noise-ridged burn front with ember glow and sparks.","shatter":"Jittered shards fly apart revealing the incoming clip.","domain_warp":"Organic noise-warped dissolve with an emissive frontier.","circle_crop":"Both clips crop to a shrinking/growing circle through the cut.","cross_warp":"Clips warp into each other along a dissolving threshold.","fold_horizontal":"Outgoing clip folds away horizontally, revealing the incoming.","fold_vertical":"Outgoing clip folds away vertically, revealing the incoming.","linear_blur":"Cross-dissolve through a heavy directional blur peak.","minimise_bottom_left":"Outgoing clip shrinks away into the bottom-left corner.","minimise_bottom_right":"Outgoing clip shrinks away into the bottom-right corner.","minimise_top_left":"Outgoing clip shrinks away into the top-left corner.","minimise_top_right":"Outgoing clip shrinks away into the top-right corner.","ripple":"Water-ripple distortion sweeps the cut across the frame.","rotate":"Both clips rotate about the frame centre through the cut.","splice":"Angled splice slides the incoming clip over the outgoing.","three_stripes":"Three offset stripes sweep the incoming clip in."},"example":"cross_dissolve","isRequired":true,"uniqueKey":"transitions.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"Transition duration in seconds.","example":0.5,"isRequired":true,"uniqueKey":"transitions.items.[INDEX].duration","typeLabel":"number"},"from_id":{"oneOf":[{"type":"string","title":"From Id","description":"ID of the outgoing video element (omit for the very first transition).","example":"video_01","uniqueKey":"transitions.items.[INDEX].from_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"From Id","description":"ID of the outgoing video element (omit for the very first transition).","example":"video_01","uniqueKey":"transitions.items.[INDEX].from_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transitions.items.[INDEX].from_id","typeLabel":"string | null"},"to_id":{"oneOf":[{"type":"string","title":"To Id","description":"ID of the incoming video element (omit for the very last transition).","example":"video_02","uniqueKey":"transitions.items.[INDEX].to_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"To Id","description":"ID of the incoming video element (omit for the very last transition).","example":"video_02","uniqueKey":"transitions.items.[INDEX].to_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"transitions.items.[INDEX].to_id","typeLabel":"string | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"**Deprecated — ignored by the renderer.** The transition draws at its linked videos' position; the engine reads no z key on a transition. Accepted for backward compatibility only.","example":1,"uniqueKey":"transitions.items.[INDEX].z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"**Deprecated — ignored by the renderer.** The transition draws at its linked videos' position; the engine reads no z key on a transition. Accepted for backward compatibility only.","example":1,"uniqueKey":"transitions.items.[INDEX].z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"transitions.items.[INDEX].z_index","typeLabel":"integer | null"}},"additionalProperties":false,"type":"object","required":["type","duration"],"title":"Transition","description":"A transition between two **video** elements.\n\nThe engine links transitions to video clips only — referencing an image,\ntext or other element type is rejected (it would crash the render node).","uniqueKey":"transitions.items.[INDEX]","typeLabel":"Transition · object"},"type":"array","title":"Transitions","description":"Transition effects applied between consecutive elements.","uniqueKey":"transitions","typeLabel":"Transition · object[]"},"groups":{"items":{"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique group id.","example":"hero","isRequired":true,"uniqueKey":"groups.items.[INDEX].id","typeLabel":"string"},"parent":{"oneOf":[{"type":"string","title":"Parent","description":"Parent group id for nesting.","uniqueKey":"groups.items.[INDEX].parent.oneOf.0","typeLabel":"string"},{"type":"null","title":"Parent","description":"Parent group id for nesting.","uniqueKey":"groups.items.[INDEX].parent.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].parent","typeLabel":"string | null"},"pivot":{"properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"groups.items.[INDEX].pivot.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"groups.items.[INDEX].pivot.y","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"Point","description":"Rotation/scale pivot.","uniqueKey":"groups.items.[INDEX].pivot","typeLabel":"Point · object"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Group translation (normalized).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"groups.items.[INDEX].translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"groups.items.[INDEX].translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"groups.items.[INDEX].translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Group translation (normalized).","uniqueKey":"groups.items.[INDEX].translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].translate","typeLabel":"Point · object | null"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Group scale.","default":1,"uniqueKey":"groups.items.[INDEX].scale","typeLabel":"number"},"rotation_degrees":{"type":"number","title":"Rotation Degrees","description":"In-plane (z) rotation of the group.","default":0,"uniqueKey":"groups.items.[INDEX].rotation_degrees","typeLabel":"number"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) applied to each member's orientation about its own centre — the tilted card-gallery look.","default":"0°","uniqueKey":"groups.items.[INDEX].x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) applied to each member's orientation about its own centre — the tilted card-gallery look.","default":"0°","uniqueKey":"groups.items.[INDEX].x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) applied to each member's orientation about its own centre — the tilted card-gallery look.","default":"0°","uniqueKey":"groups.items.[INDEX].x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"groups.items.[INDEX].x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis). See `x_rotation`.","default":"0°","uniqueKey":"groups.items.[INDEX].y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis). See `x_rotation`.","default":"0°","uniqueKey":"groups.items.[INDEX].y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis). See `x_rotation`.","default":"0°","uniqueKey":"groups.items.[INDEX].y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"groups.items.[INDEX].y_rotation","typeLabel":"integer | number | string"},"opacity":{"type":"number","maximum":1,"minimum":0,"title":"Opacity","description":"Group opacity.","default":1,"uniqueKey":"groups.items.[INDEX].opacity","typeLabel":"number"},"members":{"items":{"type":"string","uniqueKey":"groups.items.[INDEX].members.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Members","description":"Member element uuids.","uniqueKey":"groups.items.[INDEX].members","typeLabel":"string[]"},"animations":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].animations.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"groups.items.[INDEX].animations.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Animations","description":"Animations driving the whole group about `pivot`. Translate, scale, rotation and colour all compose — that is how you move or resize a whole scene as one unit. Two channels do NOT: a preset that animates **clip** (`wipe_left/right/up/down`) or **crop** (`ken_burns_*`) is a silent no-op on a group, doing nothing at all rather than erroring — put those on a member element instead. Non-uniform scale is also flattened here: only the x component of a `custom_animations` `scale` keyframe is used, so `{x:2,y:1}` scales uniformly. Note `zoom_out` barely moves (scale 1.0->0.9 under a full fade), so it reads as a pure fade; for a real shrink use a `custom` entry with the scale travel you want, or the group's static `scale`.","uniqueKey":"groups.items.[INDEX].animations","typeLabel":"Motion · object[]"},"layout":{"oneOf":[{"type":"object","title":"StackLayout","description":"Optional stack layout.","properties":{"type":{"type":"string","const":"stack","title":"Type","default":"stack","uniqueKey":"groups.items.[INDEX].layout.oneOf.0.type","typeLabel":"string"},"direction":{"type":"string","enum":["row","column"],"title":"Direction","default":"row","uniqueKey":"groups.items.[INDEX].layout.oneOf.0.direction","typeLabel":"enum\u003cstring>"},"gap":{"type":"number","title":"Gap","description":"Gap between members, normalized along the main axis.","default":0,"uniqueKey":"groups.items.[INDEX].layout.oneOf.0.gap","typeLabel":"number"},"align":{"type":"string","enum":["start","center","end"],"title":"Align","default":"center","uniqueKey":"groups.items.[INDEX].layout.oneOf.0.align","typeLabel":"enum\u003cstring>"},"origin":{"oneOf":[{"type":"object","title":"Point","description":"Centre of the whole stack.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"groups.items.[INDEX].layout.oneOf.0.origin.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"groups.items.[INDEX].layout.oneOf.0.origin.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"groups.items.[INDEX].layout.oneOf.0.origin.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Centre of the whole stack.","uniqueKey":"groups.items.[INDEX].layout.oneOf.0.origin.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].layout.oneOf.0.origin","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"groups.items.[INDEX].layout.oneOf.0","typeLabel":"StackLayout · object"},{"type":"null","description":"Optional stack layout.","uniqueKey":"groups.items.[INDEX].layout.oneOf.1","typeLabel":"null"}],"uniqueKey":"groups.items.[INDEX].layout","typeLabel":"StackLayout · object | null"}},"additionalProperties":false,"type":"object","required":["id"],"title":"Group","description":"A transform group over member elements (§5, A6). Composes member → group → parent.\n\nThe alias of a frame (render-node AEC §5, TR1): the engine lowers each group to a frame\nwhose box is the canvas, anchored at `pivot`, offset by `translate`, with `members` as\nits children, so nothing it draws changes. Kept for existing documents; nest elements\nin a `frame` element instead. A request with `frame` or `instance` elements carries no\ngroups.","uniqueKey":"groups.items.[INDEX]","typeLabel":"Group · object"},"type":"array","title":"Groups","description":"Transform groups over member elements (compose member→group→parent; optional stack layout), the alias of frames (§5). A request with `frame` or `instance` elements carries none.","uniqueKey":"groups","typeLabel":"Group · object[]"},"design_size":{"oneOf":[{"type":"object","title":"DesignSize","description":"The logical root in design px: frames and instances at the root are placed in this box, and the render scales it uniformly to `width` x `height`, whose aspect it must have. Canvas percent at the root is unchanged.","required":["width","height"],"properties":{"width":{"type":"number","exclusiveMinimum":0,"title":"Width","description":"Width in design px.","example":1920,"isRequired":true,"uniqueKey":"design_size.oneOf.0.width","typeLabel":"number"},"height":{"type":"number","exclusiveMinimum":0,"title":"Height","description":"Height in design px.","example":1080,"isRequired":true,"uniqueKey":"design_size.oneOf.0.height","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"design_size.oneOf.0","typeLabel":"DesignSize · object"},{"type":"null","description":"The logical root in design px: frames and instances at the root are placed in this box, and the render scales it uniformly to `width` x `height`, whose aspect it must have. Canvas percent at the root is unchanged.","uniqueKey":"design_size.oneOf.1","typeLabel":"null"}],"uniqueKey":"design_size","typeLabel":"DesignSize · object | null"},"operations":{"oneOf":[{"type":"object","title":"OperationsBlock","description":"Element properties driven over time (GVR §4.3): groups of operations, each counting from an anchor. Schema: `blocks.operations` in GET /v1/capabilities.","properties":{"markers":{"items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","example":"beat","isRequired":true,"uniqueKey":"operations.oneOf.0.markers.items.[INDEX].name","typeLabel":"string"},"time":{"type":"number","title":"Time","description":"Seconds on the composition clock.","example":1.5,"isRequired":true,"uniqueKey":"operations.oneOf.0.markers.items.[INDEX].time","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["name","time"],"title":"OperationMarker","description":"A named time a `marker` anchor reads.","uniqueKey":"operations.oneOf.0.markers.items.[INDEX]","typeLabel":"OperationMarker · object"},"type":"array","title":"Markers","description":"Named times `marker` anchors read.","default":[],"uniqueKey":"operations.oneOf.0.markers","typeLabel":"OperationMarker · object[]"},"groups":{"items":{"properties":{"ops":{"items":{"oneOf":[{"type":"object","title":"Operation","description":"One property driven over a window (GVR §4.3): the base value, then the replaces by\nstart, then the multiplies and the adds. It holds `to` after `end`.","required":["target","start","end","property"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.end","typeLabel":"number"},"property":{"type":"string","title":"Property","description":"A property registry path: `position.x`, `size.y`, `scale`, `rotation`, `opacity`, `fill`, `geometry.ring.segments[0].sweep`, `text.value`, …; a colour takes `.r`/`.g`/`.b`/`.a`. GET /v1/capabilities lists every path, its unit and range under `registry.properties`.","example":"geometry.ring.segments[0].sweep","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.property","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"from":{"oneOf":[{"type":"number","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.0","typeLabel":"number"},{"type":"string","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.1","typeLabel":"string"},{"type":"null","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.2","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from","typeLabel":"number | string | null"},"to":{"oneOf":[{"type":"number","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.0","typeLabel":"number"},{"type":"string","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.1","typeLabel":"string"},{"type":"null","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.2","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to","typeLabel":"number | string | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"The engine's shared easing name map (Easing.cpp `StringToEasingType`).\n\nEvery name here resolves on every keyframe surface (morph/trim/mask/custom\nanimation keyframes, selector ``ease``, counter ``easing``). ``ease_in`` /\n``ease_out`` / ``ease_in_out`` are the AE/CSS aliases of the ``quad_*``\ncurves. ``square_*`` is a **step** family (``square_in_out`` snaps at the\nmidpoint), not a power curve — the quadratic curves are ``quad_*``.\n``hold`` freezes the prior value until the next keyframe.\n\nThe parameterized families (spring / back / elastic / bezier) are not\nnames: express them through the dedicated keyframe sub-objects.\n\nValues:\n- `linear` — Constant speed, no acceleration.\n- `hold` — Freeze the previous value until the next keyframe (step).\n- `ease_in` — Starts slow, accelerates (alias of quad_in).\n- `ease_out` — Starts fast, decelerates (alias of quad_out).\n- `ease_in_out` — Slow start and end, faster in the middle (alias of quad_in_out).\n- `sin_in` — Gentle sinusoidal acceleration in.\n- `sin_out` — Gentle sinusoidal deceleration out.\n- `sin_in_out` — Gentle sinusoidal ease both ends.\n- `square_in` — Step: snaps at the segment end (not a power curve).\n- `square_out` — Step: snaps at the segment start (not a power curve).\n- `square_in_out` — Step: snaps at the midpoint — the typewriter/glitch snap.\n- `expo_in` — Extreme exponential acceleration in.\n- `expo_out` — Extreme exponential deceleration out.\n- `expo_in_out` — Extreme exponential ease both ends.\n- `quad_in` — Quadratic acceleration in.\n- `quad_out` — Quadratic deceleration out.\n- `quad_in_out` — Quadratic ease both ends.\n- `cubic_in` — Cubic acceleration in (stronger than quad).\n- `cubic_out` — Cubic deceleration out (stronger than quad).\n- `cubic_in_out` — Cubic ease both ends.\n- `quart_in` — Quartic acceleration in.\n- `quart_out` — Quartic deceleration out.\n- `quart_in_out` — Quartic ease both ends.\n- `quint_in` — Quintic acceleration in (near-expo).\n- `quint_out` — Quintic deceleration out (near-expo).\n- `quint_in_out` — Quintic ease both ends.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"object","title":"EaseFamily","description":"One of the engine's twelve easing families at an intensity (GVR M3).","required":["family","intensity"],"properties":{"family":{"type":"string","enum":["smooth","natural","slowdown","accelerate","overshoot","anticipate","anticipate_overshoot","spring","elastic","bounce","impulse","throw"],"title":"Family","description":"The curve's character.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.family","typeLabel":"enum\u003cstring>"},"intensity":{"type":"number","maximum":100,"minimum":0,"title":"Intensity","description":"How strongly, 0 to 100.","example":65,"isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1","typeLabel":"EaseFamily · object"},{"type":"object","title":"EaseBezier","description":"A CSS cubic-bezier curve.","required":["bezier"],"properties":{"bezier":{"items":{"type":"number","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"Bezier","description":"`[x1, y1, x2, y2]`, as CSS `cubic-bezier`.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier","typeLabel":"number[]"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2","typeLabel":"EaseBezier · object"},{"type":"object","title":"EaseSpring","description":"A damped spring over the window.","required":["spring"],"properties":{"spring":{"properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.mass","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring","typeLabel":"SpringEasing · object"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3","typeLabel":"EaseSpring · object"},{"type":"object","title":"EaseBack","description":"An anticipate or overshoot ease (AE 'back').","required":["back"],"properties":{"back":{"properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back","typeLabel":"BackEasing · object"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4","typeLabel":"EaseBack · object"},{"type":"object","title":"EaseElastic","description":"An elastic ring-in or ring-out ease.","required":["elastic"],"properties":{"elastic":{"properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic","typeLabel":"ElasticEasing · object"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5","typeLabel":"EaseElastic · object"},{"type":"null","title":"Easing","description":"A curve name (`ease_in_out`, `hold`, …), `{family, intensity}`, or one of `{bezier: [x1, y1, x2, y2]}`, `{spring}`, `{back}`, `{elastic}`. Omitted: linear.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.6","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing","typeLabel":"enum\u003cstring> | EaseFamily · object | EaseBezier · object | EaseSpring · object | EaseBack · object | EaseElastic · object | null"},"composite":{"oneOf":[{"type":"string","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","enum":["replace","add","multiply"],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite","typeLabel":"enum\u003cstring> | null"},"split":{"oneOf":[{"type":"object","title":"OperationSplit","description":"Run it per child, letter, word or line, staggered.","required":["unit"],"properties":{"unit":{"type":"string","enum":["element","child","letter","word","line"],"title":"Unit","description":"`child` runs over a frame's children; `letter`, `word` and `line` over a text's.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.unit","typeLabel":"enum\u003cstring>"},"stagger":{"oneOf":[{"type":"number","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger","typeLabel":"number | null"},"order":{"oneOf":[{"type":"string","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","enum":["forward","reverse","centre","edges","seeded"],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order","typeLabel":"enum\u003cstring> | null"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0","typeLabel":"OperationSplit · object"},{"type":"null","description":"Run it per child, letter, word or line, staggered.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split","typeLabel":"OperationSplit · object | null"},"takeover":{"oneOf":[{"type":"string","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","const":"velocity","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.0","typeLabel":"string"},{"type":"null","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0","typeLabel":"Operation · object"},{"type":"object","title":"PresetOperation","description":"An element preset run as operations over the window (GVR §4.3 item 10).","required":["target","start","end","preset"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.end","typeLabel":"number"},"preset":{"type":"string","enum":["arcRise","bounceIn","drop","elasticRise","fade","floatDown","floatLeft","floatRight","floatUp","gentleFloatDown","gentleFloatLeft","gentleFloatRight","gentleFloatUp","identity","kenBurnsIn","kenBurnsInOut","kenBurnsOut","loop-3DSpin","loop-3DSway","loop-bounce","loop-heartBeat","loop-jiggle","loop-orbit","loop-rotateBasic","loop-rotateSmooth","loop-squeezy","loop-sway","out-bounceOut","out-dropOut","out-elasticDrop","out-fade","out-floatDown","out-floatLeft","out-floatRight","out-floatUp","out-gentleFloatDown","out-gentleFloatLeft","out-gentleFloatRight","out-gentleFloatUp","out-pop","out-slideBounceDown","out-slideBounceLeft","out-slideBounceRight","out-slideBounceUp","out-slideDown","out-slideLeft","out-slideRight","out-slideUp","out-spinAntiClockwise","out-spinClockwise","out-swingOut","out-wipeDown","out-wipeLeft","out-wipeRight","out-wipeUp","out-zoomOut","pop","slideBounceDown","slideBounceLeft","slideBounceRight","slideBounceUp","slideDown","slideLeft","slideRight","slideUp","smoothPop","spinAntiClockwise","spinClockwise","springPop","swingIn","tiltZoom","wipeDown","wipeLeft","wipeRight","wipeUp","zoomIn"],"title":"Preset","description":"An element preset by the engine's name (`slideUp`, `zoomIn`, `fade`, …). Text presets stay on a text's `motion`.","example":"zoomIn","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.preset","typeLabel":"enum\u003cstring>"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1","typeLabel":"PresetOperation · object"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX]","typeLabel":"Operation · object | PresetOperation · object"},"type":"array","title":"Ops","description":"Operations and presets in document order: at equal starts the later replace wins.","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].ops","typeLabel":"(Operation · object | PresetOperation · object)[]"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].name","typeLabel":"string | null"},"role":{"oneOf":[{"type":"string","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].role.oneOf.0","typeLabel":"string"},{"type":"null","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].role.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].role","typeLabel":"string | null"},"anchor":{"oneOf":[{"type":"object","title":"OperationAnchor","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","required":["ref"],"properties":{"ref":{"type":"string","enum":["composition","element.start","element.end","marker","instance.start"],"title":"Ref","description":"`composition` (0 s), `element.start` or `element.end` of `target`, a marker by `name`, or `instance.start` of `target` (in a component, its own instance).","isRequired":true,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.ref","typeLabel":"enum\u003cstring>"},"target":{"oneOf":[{"type":"string","title":"Target","description":"The element or instance an element or instance anchor reads.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target","description":"The element or instance an element or instance anchor reads.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"The marker a `marker` anchor reads.","minLength":1,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"The marker a `marker` anchor reads.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name","typeLabel":"string | null"},"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0","typeLabel":"OperationAnchor · object"},{"type":"null","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations.oneOf.0.groups.items.[INDEX].anchor","typeLabel":"OperationAnchor · object | null"}},"additionalProperties":false,"type":"object","required":["ops"],"title":"OperationGroup","description":"Operations sharing one anchor (GVR §4.3).","uniqueKey":"operations.oneOf.0.groups.items.[INDEX]","typeLabel":"OperationGroup · object"},"type":"array","maxItems":1000,"title":"Groups","description":"At most 1000 groups and 10000 operations.","default":[],"uniqueKey":"operations.oneOf.0.groups","typeLabel":"OperationGroup · object[]"}},"additionalProperties":false,"uniqueKey":"operations.oneOf.0","typeLabel":"OperationsBlock · object"},{"type":"null","description":"Element properties driven over time (GVR §4.3): groups of operations, each counting from an anchor. Schema: `blocks.operations` in GET /v1/capabilities.","uniqueKey":"operations.oneOf.1","typeLabel":"null"}],"uniqueKey":"operations","typeLabel":"OperationsBlock · object | null"},"components":{"items":{"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"What an instance's `component` names.","example":"card","isRequired":true,"uniqueKey":"components.items.[INDEX].id","typeLabel":"string"},"width":{"type":"number","exclusiveMinimum":0,"title":"Width","description":"Box width in design px.","example":552,"isRequired":true,"uniqueKey":"components.items.[INDEX].width","typeLabel":"number"},"height":{"type":"number","exclusiveMinimum":0,"title":"Height","description":"Box height in design px.","example":400,"isRequired":true,"uniqueKey":"components.items.[INDEX].height","typeLabel":"number"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Its instances clip to the box unless they say otherwise.","uniqueKey":"components.items.[INDEX].clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Its instances clip to the box unless they say otherwise.","uniqueKey":"components.items.[INDEX].clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Its instances' clip corner radius in design px.","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Its instances' clip corner radius in design px.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Its instances' clip corner radius in design px.","uniqueKey":"components.items.[INDEX].corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"properties":{"items":{"properties":{"name":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]*$","title":"Name","description":"A letter, then letters, digits or `_`.","example":"title","isRequired":true,"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].name","typeLabel":"string"},"type":{"type":"string","enum":["text","colour","number","boolean","media","component","variant"],"title":"Type","description":"`text`, `colour` (`#RRGGBB` or `#RRGGBBAA`), `number`, `boolean`, `media` (a URL), `component` (an id from `allowed`) or `variant` (a nested instance's).","isRequired":true,"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"bind":{"items":{"type":"string","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].bind.items.[INDEX]","typeLabel":"string"},"type":"array","minItems":1,"title":"Bind","description":"Body fields it writes, as `\u003cchild id>.\u003cfield>` in this API's field names: any element's `x`, `y`, `z_rotation`, `opacity` and `visible`; a frame's or instance's `scale` and `clip`; a text's `text`, `text_color` and `font_size`; a shape's `fill`, `stroke` and `stroke_width`; an image's or video's `source_url`; an instance's `component`, `variant` and `properties.\u003cname>`.","example":["title.text"],"isRequired":true,"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].bind","typeLabel":"string[]"},"default":{"oneOf":[{"type":"boolean","title":"Default","description":"Its value when an instance sets none. Omitted: the body's own.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default.oneOf.0","typeLabel":"boolean"},{"type":"integer","title":"Default","description":"Its value when an instance sets none. Omitted: the body's own.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default.oneOf.1","typeLabel":"integer"},{"type":"number","title":"Default","description":"Its value when an instance sets none. Omitted: the body's own.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default.oneOf.2","typeLabel":"number"},{"type":"string","title":"Default","description":"Its value when an instance sets none. Omitted: the body's own.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default.oneOf.3","typeLabel":"string"},{"type":"null","title":"Default","description":"Its value when an instance sets none. Omitted: the body's own.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default.oneOf.4","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].default","typeLabel":"boolean | integer | number | string | null"},"min":{"oneOf":[{"type":"number","title":"Min","description":"A `number` property's lowest value.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].min.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min","description":"A `number` property's lowest value.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].min.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].min","typeLabel":"number | null"},"max":{"oneOf":[{"type":"number","title":"Max","description":"A `number` property's highest value.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].max.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max","description":"A `number` property's highest value.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].max.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].max","typeLabel":"number | null"},"allowed":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].allowed.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Allowed","description":"The component ids a `component` property may swap in. Required on one.","minItems":1,"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].allowed.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Allowed","description":"The component ids a `component` property may swap in. Required on one.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].allowed.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].allowed","typeLabel":"string[] | null"}},"additionalProperties":false,"type":"object","required":["name","type","bind"],"title":"ComponentProperty","description":"A typed property an instance sets, written into the body fields it binds.","uniqueKey":"components.items.[INDEX].properties.items.[INDEX]","typeLabel":"ComponentProperty · object"},"type":"array","title":"Properties","description":"What an instance can set.","default":[],"uniqueKey":"components.items.[INDEX].properties","typeLabel":"ComponentProperty · object[]"},"children":{"oneOf":[{"type":"array","items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{}],"uniqueKey":"components.items.[INDEX].children.oneOf.0.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object"},"title":"Children","description":"The body of a single-variant component, in design px from the box's top-left corner. Give this or `variants`.","uniqueKey":"components.items.[INDEX].children.oneOf.0","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[]"},{"type":"null","title":"Children","description":"The body of a single-variant component, in design px from the box's top-left corner. Give this or `variants`.","uniqueKey":"components.items.[INDEX].children.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].children","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[] | null"},"operations":{"oneOf":[{"type":"object","title":"OperationsBlock","description":"The body's operations (beside `children`); groups count from `instance.start` unless they say otherwise.","properties":{"markers":{"items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","example":"beat","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.markers.items.[INDEX].name","typeLabel":"string"},"time":{"type":"number","title":"Time","description":"Seconds on the composition clock.","example":1.5,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.markers.items.[INDEX].time","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["name","time"],"title":"OperationMarker","description":"A named time a `marker` anchor reads.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.markers.items.[INDEX]","typeLabel":"OperationMarker · object"},"type":"array","title":"Markers","description":"Named times `marker` anchors read.","default":[],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.markers","typeLabel":"OperationMarker · object[]"},"groups":{"items":{"properties":{"ops":{"items":{"oneOf":[{"type":"object","title":"Operation","description":"One property driven over a window (GVR §4.3): the base value, then the replaces by\nstart, then the multiplies and the adds. It holds `to` after `end`.","required":["target","start","end","property"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.end","typeLabel":"number"},"property":{"type":"string","title":"Property","description":"A property registry path: `position.x`, `size.y`, `scale`, `rotation`, `opacity`, `fill`, `geometry.ring.segments[0].sweep`, `text.value`, …; a colour takes `.r`/`.g`/`.b`/`.a`. GET /v1/capabilities lists every path, its unit and range under `registry.properties`.","example":"geometry.ring.segments[0].sweep","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.property","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"from":{"oneOf":[{"type":"number","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.0","typeLabel":"number"},{"type":"string","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.1","typeLabel":"string"},{"type":"null","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.2","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from","typeLabel":"number | string | null"},"to":{"oneOf":[{"type":"number","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.0","typeLabel":"number"},{"type":"string","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.1","typeLabel":"string"},{"type":"null","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.2","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to","typeLabel":"number | string | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"The engine's shared easing name map (Easing.cpp `StringToEasingType`).\n\nEvery name here resolves on every keyframe surface (morph/trim/mask/custom\nanimation keyframes, selector ``ease``, counter ``easing``). ``ease_in`` /\n``ease_out`` / ``ease_in_out`` are the AE/CSS aliases of the ``quad_*``\ncurves. ``square_*`` is a **step** family (``square_in_out`` snaps at the\nmidpoint), not a power curve — the quadratic curves are ``quad_*``.\n``hold`` freezes the prior value until the next keyframe.\n\nThe parameterized families (spring / back / elastic / bezier) are not\nnames: express them through the dedicated keyframe sub-objects.\n\nValues:\n- `linear` — Constant speed, no acceleration.\n- `hold` — Freeze the previous value until the next keyframe (step).\n- `ease_in` — Starts slow, accelerates (alias of quad_in).\n- `ease_out` — Starts fast, decelerates (alias of quad_out).\n- `ease_in_out` — Slow start and end, faster in the middle (alias of quad_in_out).\n- `sin_in` — Gentle sinusoidal acceleration in.\n- `sin_out` — Gentle sinusoidal deceleration out.\n- `sin_in_out` — Gentle sinusoidal ease both ends.\n- `square_in` — Step: snaps at the segment end (not a power curve).\n- `square_out` — Step: snaps at the segment start (not a power curve).\n- `square_in_out` — Step: snaps at the midpoint — the typewriter/glitch snap.\n- `expo_in` — Extreme exponential acceleration in.\n- `expo_out` — Extreme exponential deceleration out.\n- `expo_in_out` — Extreme exponential ease both ends.\n- `quad_in` — Quadratic acceleration in.\n- `quad_out` — Quadratic deceleration out.\n- `quad_in_out` — Quadratic ease both ends.\n- `cubic_in` — Cubic acceleration in (stronger than quad).\n- `cubic_out` — Cubic deceleration out (stronger than quad).\n- `cubic_in_out` — Cubic ease both ends.\n- `quart_in` — Quartic acceleration in.\n- `quart_out` — Quartic deceleration out.\n- `quart_in_out` — Quartic ease both ends.\n- `quint_in` — Quintic acceleration in (near-expo).\n- `quint_out` — Quintic deceleration out (near-expo).\n- `quint_in_out` — Quintic ease both ends.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"object","title":"EaseFamily","description":"One of the engine's twelve easing families at an intensity (GVR M3).","required":["family","intensity"],"properties":{"family":{"type":"string","enum":["smooth","natural","slowdown","accelerate","overshoot","anticipate","anticipate_overshoot","spring","elastic","bounce","impulse","throw"],"title":"Family","description":"The curve's character.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.family","typeLabel":"enum\u003cstring>"},"intensity":{"type":"number","maximum":100,"minimum":0,"title":"Intensity","description":"How strongly, 0 to 100.","example":65,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1","typeLabel":"EaseFamily · object"},{"type":"object","title":"EaseBezier","description":"A CSS cubic-bezier curve.","required":["bezier"],"properties":{"bezier":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"Bezier","description":"`[x1, y1, x2, y2]`, as CSS `cubic-bezier`.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier","typeLabel":"number[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2","typeLabel":"EaseBezier · object"},{"type":"object","title":"EaseSpring","description":"A damped spring over the window.","required":["spring"],"properties":{"spring":{"properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.mass","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring","typeLabel":"SpringEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3","typeLabel":"EaseSpring · object"},{"type":"object","title":"EaseBack","description":"An anticipate or overshoot ease (AE 'back').","required":["back"],"properties":{"back":{"properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back","typeLabel":"BackEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4","typeLabel":"EaseBack · object"},{"type":"object","title":"EaseElastic","description":"An elastic ring-in or ring-out ease.","required":["elastic"],"properties":{"elastic":{"properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic","typeLabel":"ElasticEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5","typeLabel":"EaseElastic · object"},{"type":"null","title":"Easing","description":"A curve name (`ease_in_out`, `hold`, …), `{family, intensity}`, or one of `{bezier: [x1, y1, x2, y2]}`, `{spring}`, `{back}`, `{elastic}`. Omitted: linear.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.6","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing","typeLabel":"enum\u003cstring> | EaseFamily · object | EaseBezier · object | EaseSpring · object | EaseBack · object | EaseElastic · object | null"},"composite":{"oneOf":[{"type":"string","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","enum":["replace","add","multiply"],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite","typeLabel":"enum\u003cstring> | null"},"split":{"oneOf":[{"type":"object","title":"OperationSplit","description":"Run it per child, letter, word or line, staggered.","required":["unit"],"properties":{"unit":{"type":"string","enum":["element","child","letter","word","line"],"title":"Unit","description":"`child` runs over a frame's children; `letter`, `word` and `line` over a text's.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.unit","typeLabel":"enum\u003cstring>"},"stagger":{"oneOf":[{"type":"number","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger","typeLabel":"number | null"},"order":{"oneOf":[{"type":"string","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","enum":["forward","reverse","centre","edges","seeded"],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order","typeLabel":"enum\u003cstring> | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0","typeLabel":"OperationSplit · object"},{"type":"null","description":"Run it per child, letter, word or line, staggered.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split","typeLabel":"OperationSplit · object | null"},"takeover":{"oneOf":[{"type":"string","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","const":"velocity","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.0","typeLabel":"string"},{"type":"null","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0","typeLabel":"Operation · object"},{"type":"object","title":"PresetOperation","description":"An element preset run as operations over the window (GVR §4.3 item 10).","required":["target","start","end","preset"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.end","typeLabel":"number"},"preset":{"type":"string","enum":["arcRise","bounceIn","drop","elasticRise","fade","floatDown","floatLeft","floatRight","floatUp","gentleFloatDown","gentleFloatLeft","gentleFloatRight","gentleFloatUp","identity","kenBurnsIn","kenBurnsInOut","kenBurnsOut","loop-3DSpin","loop-3DSway","loop-bounce","loop-heartBeat","loop-jiggle","loop-orbit","loop-rotateBasic","loop-rotateSmooth","loop-squeezy","loop-sway","out-bounceOut","out-dropOut","out-elasticDrop","out-fade","out-floatDown","out-floatLeft","out-floatRight","out-floatUp","out-gentleFloatDown","out-gentleFloatLeft","out-gentleFloatRight","out-gentleFloatUp","out-pop","out-slideBounceDown","out-slideBounceLeft","out-slideBounceRight","out-slideBounceUp","out-slideDown","out-slideLeft","out-slideRight","out-slideUp","out-spinAntiClockwise","out-spinClockwise","out-swingOut","out-wipeDown","out-wipeLeft","out-wipeRight","out-wipeUp","out-zoomOut","pop","slideBounceDown","slideBounceLeft","slideBounceRight","slideBounceUp","slideDown","slideLeft","slideRight","slideUp","smoothPop","spinAntiClockwise","spinClockwise","springPop","swingIn","tiltZoom","wipeDown","wipeLeft","wipeRight","wipeUp","zoomIn"],"title":"Preset","description":"An element preset by the engine's name (`slideUp`, `zoomIn`, `fade`, …). Text presets stay on a text's `motion`.","example":"zoomIn","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.preset","typeLabel":"enum\u003cstring>"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1","typeLabel":"PresetOperation · object"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX]","typeLabel":"Operation · object | PresetOperation · object"},"type":"array","title":"Ops","description":"Operations and presets in document order: at equal starts the later replace wins.","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops","typeLabel":"(Operation · object | PresetOperation · object)[]"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name","typeLabel":"string | null"},"role":{"oneOf":[{"type":"string","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role.oneOf.0","typeLabel":"string"},{"type":"null","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role","typeLabel":"string | null"},"anchor":{"oneOf":[{"type":"object","title":"OperationAnchor","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","required":["ref"],"properties":{"ref":{"type":"string","enum":["composition","element.start","element.end","marker","instance.start"],"title":"Ref","description":"`composition` (0 s), `element.start` or `element.end` of `target`, a marker by `name`, or `instance.start` of `target` (in a component, its own instance).","isRequired":true,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.ref","typeLabel":"enum\u003cstring>"},"target":{"oneOf":[{"type":"string","title":"Target","description":"The element or instance an element or instance anchor reads.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target","description":"The element or instance an element or instance anchor reads.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"The marker a `marker` anchor reads.","minLength":1,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"The marker a `marker` anchor reads.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name","typeLabel":"string | null"},"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0","typeLabel":"OperationAnchor · object"},{"type":"null","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor","typeLabel":"OperationAnchor · object | null"}},"additionalProperties":false,"type":"object","required":["ops"],"title":"OperationGroup","description":"Operations sharing one anchor (GVR §4.3).","uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups.items.[INDEX]","typeLabel":"OperationGroup · object"},"type":"array","maxItems":1000,"title":"Groups","description":"At most 1000 groups and 10000 operations.","default":[],"uniqueKey":"components.items.[INDEX].operations.oneOf.0.groups","typeLabel":"OperationGroup · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].operations.oneOf.0","typeLabel":"OperationsBlock · object"},{"type":"null","description":"The body's operations (beside `children`); groups count from `instance.start` unless they say otherwise.","uniqueKey":"components.items.[INDEX].operations.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].operations","typeLabel":"OperationsBlock · object | null"},"variants":{"oneOf":[{"type":"array","items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","example":"compact","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].name","typeLabel":"string"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Its box width in design px. Omitted: the component's.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Its box width in design px. Omitted: the component's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Its box height in design px. Omitted: the component's.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Its box height in design px. Omitted: the component's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].height","typeLabel":"number | null"},"children":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{"type":"object","title":"FrameElement","description":"A frame (render-node AEC §5): elements nested in its box, with its own clip, mask,\nmatte, blend, effects and, as a composite, its own clock. Its children use design px\nfrom its top-left corner, frames and instances included.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique in the request; operations, mattes and anchors name it.","example":"card","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.id","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"frame","title":"Type","default":"frame","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on its parent's clock (the composition's at the root). Omitted: its parent's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on its parent's clock (the composition's at the root). Omitted: its parent's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.locked","typeLabel":"boolean"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: its parent's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: its parent's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: its parent's height.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: its parent's height.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.height","typeLabel":"number | null"},"slot":{"oneOf":[{"type":"string","title":"Slot","description":"In a component body: the slot name an instance's `slots` fill in place of this frame's own children.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.slot.oneOf.0","typeLabel":"string"},{"type":"null","title":"Slot","description":"In a component body: the slot name an instance's `slots` fill in place of this frame's own children.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.slot.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.slot","typeLabel":"string | null"},"children":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"type":"any","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{"type":"object","title":"InstanceElement","description":"An instance (render-node AEC §5g): a placed copy of a `components` definition. Its box\nis the component's (or its variant's); it sets the component's properties, fills its\nslots, and places, times and composites itself as a frame does.","required":["id","time","component"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Its content's ids become `\u003cid>/\u003cchild id>`.","example":"card1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.id","typeLabel":"string"},"time":{"type":"number","minimum":0,"title":"Time","description":"**Required.** Start in seconds on its parent's clock; every time inside the component counts from it.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time","typeLabel":"number"},"component":{"type":"string","minLength":1,"title":"Component","description":"The `components` entry it places.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.component","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"instance","title":"Type","default":"instance","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.track","typeLabel":"integer | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.locked","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","title":"Variant","description":"The variant by name. Omitted: the first.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.variant.oneOf.0","typeLabel":"string"},{"type":"null","title":"Variant","description":"The variant by name. Omitted: the first.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.variant","typeLabel":"string | null"},"properties":{"additionalProperties":{"oneOf":[{"type":"boolean","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.0","typeLabel":"boolean"},{"type":"integer","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.1","typeLabel":"integer"},{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.2","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.3","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties.additionalProperties","typeLabel":"boolean | integer | number | string"},"type":"object","title":"Properties","description":"Values of the component's declared properties, by name, each of its type.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.properties","typeLabel":"Properties · object"},"slots":{"additionalProperties":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"type":"any","title":"Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"any"},"bold":{"type":"any","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"any"},"italic":{"type":"any","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"any"},"underline":{"type":"any","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"type":"any","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"type":"any","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"any"},"smoothing":{"type":"any","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"type":"any","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"any"},"y1":{"type":"any","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"any"},"x2":{"type":"any","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"any"},"y2":{"type":"any","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"any"},"inner_ratio_percent":{"type":"any","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"any"},"start_angle":{"type":"any","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"any"},"sweep":{"type":"any","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"any"},"sweep_percent":{"type":"any","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"any"},"cap":{"type":"any","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"any"},"segments":{"type":"any","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"any"},"inner_ratio_percent":{"type":"any","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"any"},"start_angle":{"type":"any","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"any"},"sweep":{"type":"any","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"any"},"sweep_percent":{"type":"any","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"any"},"cap":{"type":"any","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"any"},"segments":{"type":"any","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"type":"any","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"any"},"corner_radius":{"type":"any","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"type":"any","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"any"},"inner_ratio":{"type":"any","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"any"},"corner_radius":{"type":"any","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"type":"any","title":"Type","description":"Omitted: `drop`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"any"},"x":{"type":"any","title":"X","description":"Horizontal offset in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"any"},"y":{"type":"any","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"any"},"blur":{"type":"any","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"any"},"spread":{"type":"any","title":"Spread","description":"Spread in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"type":"any","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"type":"any","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"any"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object"},"type":"array","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots.additionalProperties","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[]"},"type":"object","title":"Slots","description":"Content for the component's slots, by slot name, in place of the slot frame's own children.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5.slots","typeLabel":"Slots · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX].oneOf.5","typeLabel":"InstanceElement · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | InstanceElement · object"},"type":"array","title":"Children","description":"The elements inside, in design px from this frame's top-left corner; frames and instances nest. Audio stays at the root.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4.children","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | InstanceElement · object)[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.4","typeLabel":"FrameElement · object"},{"type":"object","title":"InstanceElement","description":"An instance (render-node AEC §5g): a placed copy of a `components` definition. Its box\nis the component's (or its variant's); it sets the component's properties, fills its\nslots, and places, times and composites itself as a frame does.","required":["id","time","component"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Its content's ids become `\u003cid>/\u003cchild id>`.","example":"card1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.id","typeLabel":"string"},"time":{"type":"number","minimum":0,"title":"Time","description":"**Required.** Start in seconds on its parent's clock; every time inside the component counts from it.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time","typeLabel":"number"},"component":{"type":"string","minLength":1,"title":"Component","description":"The `components` entry it places.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.component","typeLabel":"string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from its parent's left edge (at the root, the `design_size` box's, else the output's). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from its parent's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Anchor","description":"Pivot it turns and scales about, across its own box: a percent, or design px from its left edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_anchor","typeLabel":"integer | number | string | null"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_anchor.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge. Omitted: the centre.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_anchor.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_anchor","typeLabel":"integer | number | string | null"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Z Rotation","description":"Rotation in degrees. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_rotation","typeLabel":"integer | number | string | null"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"X Rotation","description":"Perspective tilt (X axis) each element inside takes about its own centre, as a group's does. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.x_rotation","typeLabel":"integer | number | string | null"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_rotation.oneOf.2","typeLabel":"string"},{"type":"null","title":"Y Rotation","description":"Perspective tilt (Y axis); see `x_rotation`. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_rotation.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.y_rotation","typeLabel":"integer | number | string | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","description":"Uniform scale about the anchor. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.scale","typeLabel":"number | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","description":"Opacity 0 to 100 of everything inside. Omitted: 100.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.opacity","typeLabel":"number | null"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among its siblings (higher on top); ties draw in array order. Everything inside draws together at its place.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.z_index","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds active. Omitted: until its parent ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.duration","typeLabel":"number | null"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","description":"Animations of the whole, about its anchor.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.motion","typeLabel":"Motion · object[]"},"clip":{"oneOf":[{"type":"boolean","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.clip.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Clip","description":"Crop what is inside to its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.clip.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.clip","typeLabel":"boolean | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"oneOf":[{"type":"number","title":"Top Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_left","typeLabel":"number | null"},"top_right":{"oneOf":[{"type":"number","title":"Top Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.top_right","typeLabel":"number | null"},"bottom_right":{"oneOf":[{"type":"number","title":"Bottom Right","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_right","typeLabel":"number | null"},"bottom_left":{"oneOf":[{"type":"number","title":"Bottom Left","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2.bottom_left","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius of the clip in design px: a number, `[top_left, top_right, bottom_right, bottom_left]` or `{top_left, ...}`. Applies with `clip`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"blend_mode":{"oneOf":[{"type":"string","title":"BlendMode","description":"Blend of its content over what is below. Omitted: normal.","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.blend_mode.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Blend of its content over what is below. Omitted: normal.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.blend_mode.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.blend_mode","typeLabel":"enum\u003cstring> | null"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic mask over its box.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Analytic mask over its box.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Feather, scale and centre of `mask_shape`.","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","description":"Feather, scale and centre of `mask_shape`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.mask","typeLabel":"MaskConfig · object | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte: another element's render drives its coverage.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","description":"Track matte: another element's render drives its coverage.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.matte","typeLabel":"Matte · object | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effects run over its content.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.effects","typeLabel":"Effect · object[]"},"render":{"oneOf":[{"type":"string","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","enum":["flatten","composite"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.render.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Render","description":"`composite` makes it a nested composition whose content runs on `time_map`'s clock; its content is graphics only (no video). Omitted: `flatten`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.render.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.render","typeLabel":"enum\u003cstring> | null"},"time_map":{"oneOf":[{"type":"object","title":"TimeMap","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","properties":{"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds into the children's timeline at the frame's start. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.offset","typeLabel":"number | null"},"speed":{"oneOf":[{"type":"number","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.0","typeLabel":"number"},{"type":"null","title":"Speed","description":"Rate of the children's timeline: 0 holds, below 0 plays backwards. Omitted: 1.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.speed","typeLabel":"number | null"},"loop":{"oneOf":[{"type":"number","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.0","typeLabel":"number"},{"type":"null","title":"Loop","description":"Seconds after which the children's timeline repeats. Omitted: no loop.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.loop","typeLabel":"number | null"},"freeze":{"oneOf":[{"type":"number","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.0","typeLabel":"number"},{"type":"null","title":"Freeze","description":"Hold the children at this many seconds into their timeline; overrides `offset` and `speed`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0.freeze","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.0","typeLabel":"TimeMap · object"},{"type":"null","description":"A composite's clock: `offset`, `speed`, `loop` and `freeze`. Needs `render: \"composite\"`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.time_map","typeLabel":"TimeMap · object | null"},"type":{"type":"string","const":"instance","title":"Type","default":"instance","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.track","typeLabel":"integer | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.locked","typeLabel":"boolean"},"variant":{"oneOf":[{"type":"string","title":"Variant","description":"The variant by name. Omitted: the first.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.variant.oneOf.0","typeLabel":"string"},{"type":"null","title":"Variant","description":"The variant by name. Omitted: the first.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.variant.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.variant","typeLabel":"string | null"},"properties":{"additionalProperties":{"oneOf":[{"type":"boolean","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.0","typeLabel":"boolean"},{"type":"integer","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.1","typeLabel":"integer"},{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.2","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties.additionalProperties.oneOf.3","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties.additionalProperties","typeLabel":"boolean | integer | number | string"},"type":"object","title":"Properties","description":"Values of the component's declared properties, by name, each of its type.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.properties","typeLabel":"Properties · object"},"slots":{"additionalProperties":{"items":{"oneOf":[{"type":"object","title":"ChildVideoElement","description":"A video inside a frame. Not inside a composite frame, whose content is graphics only.","required":["source_url"],"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.","example":"https://cdn.example.com/clip.mp4","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"video","title":"Type","default":"video","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.locked","typeLabel":"boolean"},"in_point":{"oneOf":[{"type":"number","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","minimum":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"In Point","description":"In point — seconds into the source file to start playing from. Defaults to `0`.","example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.in_point","typeLabel":"number | null"},"out_point":{"oneOf":[{"type":"number","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","minimum":0,"example":6,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.0","typeLabel":"number"},{"type":"null","title":"Out Point","description":"Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.","example":6,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.out_point","typeLabel":"number | null"},"speed":{"type":"number","maximum":4,"minimum":0.25,"title":"Speed","description":"Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).","default":1,"example":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.speed","typeLabel":"number"},"playback_rate_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"rate":{"type":"number","minimum":0,"title":"Rate","description":"Playback rate (0 = freeze-frame).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX].rate","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","rate"],"title":"RateKeyframe","description":"A point on a video speed ramp (§5c). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0.items.[INDEX]","typeLabel":"RateKeyframe · object"},"title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","maxItems":512,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.0","typeLabel":"RateKeyframe · object[]"},{"type":"null","title":"Playback Rate Keyframes","description":"Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.playback_rate_keyframes","typeLabel":"RateKeyframe · object[] | null"},"volume":{"type":"number","maximum":100,"minimum":0,"title":"Volume","description":"Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.","default":100,"example":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.volume","typeLabel":"number"},"muted":{"type":"boolean","title":"Muted","description":"Silence the clip's embedded audio. `volume` is kept, so unmuting restores the level.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.muted","typeLabel":"boolean"},"loop":{"type":"boolean","title":"Loop","description":"Repeat the source to fill the clip: when playback passes the end of the file it restarts from the file's first frame (not `in_point`). Set `out_point` past the source's length to choose how long the clip runs — its timeline length is still `(out_point − in_point) / speed`. Requires `out_point`.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.loop","typeLabel":"boolean"},"fade_in_duration":{"type":"number","title":"Fade In Duration","description":"Duration in seconds of a linear audio fade-in at the clip's start.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_in_duration","typeLabel":"number"},"fade_out_duration":{"type":"number","title":"Fade Out Duration","description":"Duration in seconds of a linear audio fade-out at the clip's end.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.fade_out_duration","typeLabel":"number"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.0","typeLabel":"ChildVideoElement · object"},{"type":"object","title":"ChildTextElement","description":"A text inside a frame; `width` is its wrap width.","required":["text"],"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The text content to render.","example":"Hello World","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text","typeLabel":"string"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow_y","typeLabel":"integer | number | string"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"text","title":"Type","default":"text","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.type","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.","example":"clip_01","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.duration","typeLabel":"number | null"},"font_family":{"type":"string","title":"Font Family","description":"Font family name. Must be available to the renderer.","default":"Inter","example":"Inter","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_family","typeLabel":"string"},"font_size":{"type":"number","exclusiveMinimum":0,"title":"Font Size","description":"Font size in pixels.","default":16,"example":48,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_size","typeLabel":"number"},"font_weight":{"type":"integer","maximum":900,"minimum":100,"title":"Font Weight","description":"Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).","default":400,"example":400,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_weight","typeLabel":"integer"},"font_style":{"type":"string","enum":["normal","italic","bold","bolditalic"],"title":"Font Style","description":"Font style variant.","default":"normal","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.font_style","typeLabel":"enum\u003cstring>"},"text_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Text Color","description":"Text fill color as a hex string.","default":"#ffffff","example":"#ffffff","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_color","typeLabel":"string"},"text_align":{"type":"string","enum":["left","center","right"],"title":"Text Align","description":"Horizontal text alignment.","default":"center","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_align","typeLabel":"enum\u003cstring>"},"text_direction":{"type":"string","enum":["ltr","rtl"],"title":"Text Direction","description":"Text direction. `rtl` for right-to-left scripts (§4).","default":"ltr","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_direction","typeLabel":"enum\u003cstring>"},"text_decoration":{"type":"string","enum":["none","underline","strikethrough"],"title":"Text Decoration","description":"Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_decoration","typeLabel":"enum\u003cstring>"},"tracking":{"type":"number","title":"Tracking","description":"Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.","default":0,"example":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tracking","typeLabel":"number"},"tabular_numbers":{"type":"boolean","title":"Tabular Numbers","description":"Tabular (monospaced) figures: every digit takes the same advance, so columns of numbers align across lines and a `counter` does not jitter as its value changes. The renderer's baked fonts carry the OpenType alternates; a font whose face lacks the feature gets synthesised tabular digits in the export only. Default `false` = the font's proportional figures.","default":false,"example":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.tabular_numbers","typeLabel":"boolean"},"leading":{"type":"number","title":"Leading","description":"Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.","default":1.2,"example":1.2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.leading","typeLabel":"number"},"stroke_color":{"oneOf":[{"type":"string","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke Color","description":"Outline color. Set together with `stroke_width` to enable text outlines.","example":"#000000","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_color","typeLabel":"string | null"},"stroke_width":{"type":"number","title":"Stroke Width","description":"Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke_width","typeLabel":"number"},"background_color":{"oneOf":[{"type":"string","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Background Color","description":"Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_color","typeLabel":"string | null"},"background_opacity":{"type":"number","maximum":100,"minimum":0,"title":"Background Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_opacity","typeLabel":"number"},"x_padding":{"oneOf":[{"type":"integer","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.x_padding","typeLabel":"integer | number | string"},"y_padding":{"oneOf":[{"type":"integer","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Padding","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.y_padding","typeLabel":"integer | number | string"},"background":{"type":"boolean","title":"Background","description":"Solid color box behind the full text block. Set `background_color` to choose the color.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background","typeLabel":"boolean"},"background_style":{"type":"string","enum":["block","line_hard","line_round"],"title":"Background Style","description":"Shape of the `background` plate: `block` — one box behind the whole text; `line_hard` — a square-cornered box behind each line; `line_round` — a rounded box behind each line. Requires `background: true`. An animation that centres its words draws the `block` plate whichever style is set.","default":"block","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.background_style","typeLabel":"enum\u003cstring>"},"stroke":{"type":"boolean","title":"Stroke","description":"Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.stroke","typeLabel":"boolean"},"shadow":{"type":"boolean","title":"Shadow","description":"Built-in drop shadow.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.shadow","typeLabel":"boolean"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.motion","typeLabel":"Motion · object[]"},"word_animation":{"oneOf":[{"type":"object","title":"WordAnimation","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","required":["style","words"],"example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"properties":{"style":{"type":"string","enum":["glow","box","scale_pop","slide_up","fly_in","color"],"title":"WordAnimationStyle","description":"[API extension] Word-level animations (require word_animation.words).\n\nValues:\n- `glow` — Highlights the active word with a glowing emphasis.\n- `box` — Draws a colored box behind the active word.\n- `scale_pop` — Pops the active word with a quick scale punch.\n- `slide_up` — Floats each word up into place as it becomes active.\n- `fly_in` — Drops each word in from above as it becomes active.\n- `color` — Recolors the active word (karaoke-style highlight).","x-enumDescriptions":{"glow":"Highlights the active word with a glowing emphasis.","box":"Draws a colored box behind the active word.","scale_pop":"Pops the active word with a quick scale punch.","slide_up":"Floats each word up into place as it becomes active.","fly_in":"Drops each word in from above as it becomes active.","color":"Recolors the active word (karaoke-style highlight)."},"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.style","typeLabel":"enum\u003cstring>"},"words":{"items":{"properties":{"text":{"type":"string","title":"Text","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].text","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"ABSOLUTE output-timeline seconds (not element-relative).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX].end","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["text","start","end"],"title":"Word","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words.items.[INDEX]","typeLabel":"Word · object"},"type":"array","minItems":1,"title":"Words","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0.words","typeLabel":"Word · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.0","typeLabel":"WordAnimation · object"},{"type":"null","description":"Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.","example":{"style":"glow","words":[{"end":0.5,"start":0,"text":"Hello"}]},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.word_animation","typeLabel":"WordAnimation · object | null"},"words":{"oneOf":[{"type":"array","items":{"properties":{"word":{"type":"string","minLength":1,"title":"Word","description":"The word (whole-word match; UTF-8).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].word","typeLabel":"string"},"start":{"type":"number","minimum":0,"title":"Start","description":"Word reveal start, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].start","typeLabel":"number"},"end":{"type":"number","exclusiveMinimum":0,"title":"End","description":"Word reveal end, seconds — drives a word-group animation; ignored without one.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].end","typeLabel":"number"},"style":{"oneOf":[{"type":"object","title":"WordStyle","description":"Optional per-word style override (static for the element's life).","properties":{"color":{"oneOf":[{"type":"string","title":"Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.color","typeLabel":"string | null"},"bold":{"oneOf":[{"type":"boolean","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Bold","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.bold","typeLabel":"boolean | null"},"italic":{"oneOf":[{"type":"boolean","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Italic","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.italic","typeLabel":"boolean | null"},"underline":{"oneOf":[{"type":"boolean","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Underline","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0.underline","typeLabel":"boolean | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.0","typeLabel":"WordStyle · object"},{"type":"null","description":"Optional per-word style override (static for the element's life).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX].style","typeLabel":"WordStyle · object | null"}},"additionalProperties":false,"type":"object","required":["word","start","end"],"title":"WordSpec","description":"Per-word timing + optional style, keyed by word text (§4).\n\n``style`` overrides are static for the element's whole life. ``start``/\n``end`` drive **word-group animations only** — bind one via\n``word_animation`` (or a word-group ``animation_preset``) or the timings\nhave nothing to time and are ignored by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0.items.[INDEX]","typeLabel":"WordSpec · object"},"title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.0","typeLabel":"WordSpec · object[]"},{"type":"null","title":"Words","description":"Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.","example":[{"end":3,"start":0,"style":{"color":"#e8734a"},"word":"launch"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.words","typeLabel":"WordSpec · object[] | null"},"counter":{"oneOf":[{"type":"object","title":"ValueCounter","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","properties":{"from_value":{"type":"number","title":"From Value","description":"Start value.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.from_value","typeLabel":"number"},"to_value":{"type":"number","title":"To Value","description":"End value.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.to_value","typeLabel":"number"},"decimals":{"type":"integer","maximum":6,"minimum":0,"title":"Decimals","description":"Decimal places (0–6).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.decimals","typeLabel":"integer"},"prefix":{"type":"string","title":"Prefix","description":"Text prepended to the number.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.prefix","typeLabel":"string"},"suffix":{"type":"string","title":"Suffix","description":"Text appended to the number, e.g. '%'.","default":"","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.suffix","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.easing","typeLabel":"string | null"},"start_time":{"type":"number","minimum":0,"title":"Start Time","description":"Seconds into the element to start the sweep.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.start_time","typeLabel":"number"},"length":{"oneOf":[{"type":"number","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.0","typeLabel":"number"},{"type":"null","title":"Length","description":"Sweep duration; defaults to the element's remaining life.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0.length","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.0","typeLabel":"ValueCounter · object"},{"type":"null","description":"Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.counter","typeLabel":"ValueCounter · object | null"},"glow":{"oneOf":[{"type":"object","title":"TextGlow","description":"Soft glow around the glyphs (§4).","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#ffffff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.color","typeLabel":"string"},"size":{"type":"number","minimum":0,"title":"Size","description":"Glow size, em-relative.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.size","typeLabel":"number"},"intensity":{"type":"number","minimum":0,"title":"Intensity","description":"Glow intensity.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.0","typeLabel":"TextGlow · object"},{"type":"null","description":"Soft glow around the glyphs (§4).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.glow","typeLabel":"TextGlow · object | null"},"text_wrap":{"type":"string","enum":["wrap","nowrap"],"title":"Text Wrap","default":"wrap","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.text_wrap","typeLabel":"enum\u003cstring>"},"animation_preset":{"oneOf":[{"type":"string","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Animation Preset","description":"Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type`, `preset` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1.animation_preset","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.1","typeLabel":"ChildTextElement · object"},{"type":"object","title":"ChildImageElement","description":"An image inside a frame.","required":["id","source_url"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.","example":"logo_01","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.id","typeLabel":"string"},"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url","description":"URL of the image file (PNG, JPG, WebP, GIF, SVG). A `.svg` draws a subset: groups and the basic shapes and paths, filled and stroked with flat colours. An element that uses anything else (a `style` attribute, `clip-path`, `mask`, `filter`, `stroke-dasharray`, a gradient or `currentColor` paint, `\u003ctext>`, `\u003cuse>`, `\u003cimage>`) is not drawn, nor anything inside it; an SVG that would draw nothing at all is refused at submit. Set explicit colours and presentation attributes, or pre-rasterize to PNG.","example":"https://cdn.example.com/logo.png","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.source_url","typeLabel":"string\u003curi>"},"lut_url":{"oneOf":[{"type":"string","title":"Lut Url","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Lut Url","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_url","typeLabel":"string\u003curi> | null"},"lut_intensity":{"type":"number","maximum":100,"minimum":0,"title":"Lut Intensity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.lut_intensity","typeLabel":"number"},"brightness":{"type":"number","title":"Brightness","description":"Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.brightness","typeLabel":"number"},"contrast":{"type":"number","title":"Contrast","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.contrast","typeLabel":"number"},"saturation":{"type":"number","title":"Saturation","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.saturation","typeLabel":"number"},"exposure":{"type":"number","title":"Exposure","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.exposure","typeLabel":"number"},"sharpness":{"type":"number","title":"Sharpness","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.sharpness","typeLabel":"number"},"blur":{"type":"number","title":"Blur","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blur","typeLabel":"number"},"noise":{"type":"number","title":"Noise","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.noise","typeLabel":"number"},"vignette":{"type":"number","title":"Vignette","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vignette","typeLabel":"number"},"hue_rotate":{"type":"number","title":"Hue Rotate","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.hue_rotate","typeLabel":"number"},"temperature":{"type":"number","title":"Temperature","description":"White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.temperature","typeLabel":"number"},"tint":{"type":"number","title":"Tint","description":"White balance magenta (+) / green (−), −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.tint","typeLabel":"number"},"vibrance":{"type":"number","title":"Vibrance","description":"Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.vibrance","typeLabel":"number"},"highlights":{"type":"number","title":"Highlights","description":"Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.highlights","typeLabel":"number"},"shadows":{"type":"number","title":"Shadows","description":"Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadows","typeLabel":"number"},"crop_top":{"type":"number","maximum":1,"minimum":0,"title":"Crop Top","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_top","typeLabel":"number"},"crop_bottom":{"type":"number","maximum":1,"minimum":0,"title":"Crop Bottom","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_bottom","typeLabel":"number"},"crop_left":{"type":"number","maximum":1,"minimum":0,"title":"Crop Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_left","typeLabel":"number"},"crop_right":{"type":"number","maximum":1,"minimum":0,"title":"Crop Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.crop_right","typeLabel":"number"},"border_radius":{"oneOf":[{"type":"integer","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Radius","description":"Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.2","typeLabel":"string"},{"type":"object","title":"CornerRadiiPx","description":"Per-corner radii in pixels (for `border_radius` on video/image/text elements).","default":0,"properties":{"top_left":{"oneOf":[{"type":"integer","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_left","typeLabel":"integer | number | string"},"top_right":{"oneOf":[{"type":"integer","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.top_right","typeLabel":"integer | number | string"},"bottom_right":{"oneOf":[{"type":"integer","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_right","typeLabel":"integer | number | string"},"bottom_left":{"oneOf":[{"type":"integer","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.1","typeLabel":"number"},{"type":"string","title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3.bottom_left","typeLabel":"integer | number | string"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius.oneOf.3","typeLabel":"CornerRadiiPx · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_radius","typeLabel":"integer | number | string | CornerRadiiPx · object"},"border_color":{"oneOf":[{"type":"string","title":"Border Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Border Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_color","typeLabel":"string | null"},"border_width":{"oneOf":[{"type":"integer","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.1","typeLabel":"number"},{"type":"string","title":"Border Width","description":"Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.border_width","typeLabel":"integer | number | string"},"shadow_color":{"oneOf":[{"type":"string","title":"Shadow Color","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Shadow Color","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_color","typeLabel":"string | null"},"shadow_blur":{"oneOf":[{"type":"integer","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Blur","description":"Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_blur","typeLabel":"integer | number | string"},"shadow_x":{"oneOf":[{"type":"integer","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow X","description":"Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_x","typeLabel":"integer | number | string"},"shadow_y":{"oneOf":[{"type":"integer","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.1","typeLabel":"number"},{"type":"string","title":"Shadow Y","description":"Vertical shadow offset in pixels. See `shadow_x`.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.shadow_y","typeLabel":"integer | number | string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"image","title":"Type","default":"image","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.duration","typeLabel":"number | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.2","typeLabel":"ChildImageElement · object"},{"type":"object","title":"ChildShapeElement","description":"A shape inside a frame.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"**Required.** Unique identifier.","example":"blob-1","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.id","typeLabel":"string"},"blend_mode":{"type":"string","enum":["none","multiply","screen","overlay","darken","lighten","color_dodge","color_burn","hard_light","soft_light","difference","add","exclusion","hue","saturation","color","luminosity"],"title":"BlendMode","description":"Values:\n- `none` — Normal compositing (source-over) — the default.\n- `multiply` — Multiply blend — darkens by multiplying layer colors.\n- `screen` — Screen blend — lightens by inverting, multiplying, inverting.\n- `overlay` — Overlay blend — multiply in shadows, screen in highlights.\n- `darken` — Darken blend — keeps the darker of the two layers per channel.\n- `lighten` — Lighten blend — keeps the lighter of the two layers per channel.\n- `color_dodge` — Color-dodge blend — brightens the base toward the blend color.\n- `color_burn` — Color-burn blend — darkens the base toward the blend color.\n- `hard_light` — Hard-light blend — overlay with layers swapped.\n- `soft_light` — Soft-light blend — a gentler hard-light.\n- `difference` — Difference blend — absolute difference of the two layers per channel.\n- `add` — Additive (linear-dodge) blend — sums layer colors, clamped.\n- `exclusion` — Exclusion blend — like difference, lower contrast.\n- `hue` — Hue blend — backdrop luminosity + saturation with the blend layer's hue.\n- `saturation` — Saturation blend — backdrop hue + luminosity with the blend layer's saturation.\n- `color` — Color blend — backdrop luminosity with the blend layer's hue + saturation.\n- `luminosity` — Luminosity blend — backdrop hue + saturation with the blend layer's luminosity.","x-enumDescriptions":{"none":"Normal compositing (source-over) — the default.","multiply":"Multiply blend — darkens by multiplying layer colors.","screen":"Screen blend — lightens by inverting, multiplying, inverting.","overlay":"Overlay blend — multiply in shadows, screen in highlights.","darken":"Darken blend — keeps the darker of the two layers per channel.","lighten":"Lighten blend — keeps the lighter of the two layers per channel.","color_dodge":"Color-dodge blend — brightens the base toward the blend color.","color_burn":"Color-burn blend — darkens the base toward the blend color.","hard_light":"Hard-light blend — overlay with layers swapped.","soft_light":"Soft-light blend — a gentler hard-light.","difference":"Difference blend — absolute difference of the two layers per channel.","add":"Additive (linear-dodge) blend — sums layer colors, clamped.","exclusion":"Exclusion blend — like difference, lower contrast.","hue":"Hue blend — backdrop luminosity + saturation with the blend layer's hue.","saturation":"Saturation blend — backdrop hue + luminosity with the blend layer's saturation.","color":"Color blend — backdrop luminosity with the blend layer's hue + saturation.","luminosity":"Luminosity blend — backdrop hue + saturation with the blend layer's luminosity."},"default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.blend_mode","typeLabel":"enum\u003cstring>"},"mask_shape":{"oneOf":[{"type":"string","title":"MaskShape","description":"Analytic (SDF) shape mask that clips an element's coverage. §1.\n\nValues:\n- `circle` — Circular (ellipse) analytic mask, fit to the element bounds.\n- `diamond` — Diamond (rotated square) analytic mask.\n- `hexagon` — Regular hexagon analytic mask.\n- `star` — Five-point star analytic mask.\n- `heart` — Heart analytic mask.\n- `triangle` — Upward triangle analytic mask.","enum":["circle","diamond","hexagon","star","heart","triangle"],"x-enumDescriptions":{"circle":"Circular (ellipse) analytic mask, fit to the element bounds.","diamond":"Diamond (rotated square) analytic mask.","hexagon":"Regular hexagon analytic mask.","star":"Five-point star analytic mask.","heart":"Heart analytic mask.","triangle":"Upward triangle analytic mask."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_shape","typeLabel":"enum\u003cstring> | null"},"mask":{"oneOf":[{"type":"object","title":"MaskConfig","description":"Animated/feathered mask params layered on the analytic `mask_shape` (§5c).","properties":{"feather":{"type":"number","minimum":0,"title":"Feather","description":"Soften the mask's SDF edge.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.feather","typeLabel":"number"},"scale":{"type":"number","exclusiveMinimum":0,"title":"Scale","description":"Mask scale (iris reveals).","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.scale","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Mask centre (wipes).","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Mask centre (wipes).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.0","typeLabel":"MaskConfig · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask","typeLabel":"MaskConfig · object | null"},"mask_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"feather":{"oneOf":[{"type":"number","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.0","typeLabel":"number"},{"type":"null","title":"Feather","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].feather","typeLabel":"number | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"null","title":"Scale","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].scale","typeLabel":"number | null"},"center":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].center","typeLabel":"Point · object | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"string | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"MaskKeyframe","description":"A keyframe for animated masks (§5c). Absent fields inherit the static mask.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0.items.[INDEX]","typeLabel":"MaskKeyframe · object"},"title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.0","typeLabel":"MaskKeyframe · object[]"},{"type":"null","title":"Mask Keyframes","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.mask_keyframes","typeLabel":"MaskKeyframe · object[] | null"},"matte":{"oneOf":[{"type":"object","title":"Matte","description":"Track matte (§5d): drive this element's coverage from another layer's render.","required":["source"],"properties":{"source":{"type":"string","minLength":1,"title":"Source","description":"uuid of the source layer (auto-hidden). Text sources supported.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.source","typeLabel":"string"},"mode":{"type":"string","enum":["alpha","luma"],"title":"Mode","default":"alpha","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.mode","typeLabel":"enum\u003cstring>"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.0","typeLabel":"Matte · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.matte","typeLabel":"Matte · object | null"},"backdrop_blur":{"oneOf":[{"type":"integer","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.1","typeLabel":"number"},{"type":"string","title":"Backdrop Blur","description":"Glass: the scene behind the element, Gaussian-blurred, fills its footprint under its translucent content (a shape's own silhouette, a video's or image's box with its corner radius and mask). A Gaussian sigma in canvas px, as CSS `backdrop-filter: blur()` takes it; the renderer caps it at 128. 0 is off.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur","typeLabel":"integer | number | string"},"backdrop_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Backdrop Blur Keyframes","description":"Animate `backdrop_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.backdrop_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"layer_blur":{"type":"number","maximum":128,"minimum":0,"title":"Layer Blur","description":"Blurs the element itself as drawn: a Gaussian sigma in canvas px, as CSS `filter: blur()` takes it, spreading three sigma past its box. At most 128; 0 is off. Not on a shape yet (the editor's preview cannot draw it), and not with `blend_mode`, `backdrop_blur` or `matte`, beside which the renderer would draw the element without it.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur","typeLabel":"number"},"layer_blur_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":128,"minimum":0,"title":"Value","description":"Gaussian sigma in canvas px at `time`, at most 128.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"BlurKeyframe","description":"A blur sigma at a time (V6): linear between keyframes, the first and last held\noutside them. Any order: the renderer sorts them by time.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0.items.[INDEX]","typeLabel":"BlurKeyframe · object"},"title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.0","typeLabel":"BlurKeyframe · object[]"},{"type":"null","title":"Layer Blur Keyframes","description":"Animate `layer_blur` over the timeline; replaces the static value while present.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.layer_blur_keyframes","typeLabel":"BlurKeyframe · object[] | null"},"glass":{"oneOf":[{"type":"object","title":"Glass","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","properties":{"bevel":{"oneOf":[{"type":"number","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","maximum":256,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.0","typeLabel":"number"},{"type":"null","title":"Bevel","description":"Width of the bent band at the edge in canvas px, at most 256. Omitted: 16.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.bevel","typeLabel":"number | null"},"refraction":{"oneOf":[{"type":"number","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.0","typeLabel":"number"},{"type":"null","title":"Refraction","description":"How far the edge bends the scene inward, 0–1. Omitted: 0.5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.refraction","typeLabel":"number | null"},"dispersion":{"oneOf":[{"type":"number","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.0","typeLabel":"number"},{"type":"null","title":"Dispersion","description":"How far red and blue split apart at the edge, 0–1. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0.dispersion","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.0","typeLabel":"Glass · object"},{"type":"null","description":"A refracting glass edge: the scene behind bends inward near the element's outline. Pair it with `backdrop_blur` for frosted glass.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.glass","typeLabel":"Glass · object | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Left edge in design px from the frame's left edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Top edge in design px from the frame's top edge. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y","typeLabel":"number | null"},"width":{"oneOf":[{"type":"number","title":"Width","description":"Width in design px. Omitted: the frame's width.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Width","description":"Width in design px. Omitted: the frame's width.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.width","typeLabel":"number | null"},"height":{"oneOf":[{"type":"number","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.0","typeLabel":"number"},{"type":"null","title":"Height","description":"Height in design px. Omitted: the frame's height (a text's: twice its `font_size`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.height","typeLabel":"number | null"},"aspect_ratio":{"oneOf":[{"type":"number","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Aspect Ratio","description":"**Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.aspect_ratio","typeLabel":"number | null"},"x_anchor":{"oneOf":[{"type":"integer","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Anchor","description":"Pivot the element turns and scales about, across its own box: a percent, or design px from its left edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_anchor","typeLabel":"integer | number | string"},"y_anchor":{"oneOf":[{"type":"integer","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Anchor","description":"Pivot across its own box's height: a percent, or design px from its top edge.","default":"50%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_anchor","typeLabel":"integer | number | string"},"x_rotation":{"oneOf":[{"type":"integer","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_rotation","typeLabel":"integer | number | string"},"y_rotation":{"oneOf":[{"type":"integer","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_rotation","typeLabel":"integer | number | string"},"z_rotation":{"oneOf":[{"type":"integer","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.1","typeLabel":"number"},{"type":"string","title":"Z Rotation","default":"0°","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_rotation","typeLabel":"integer | number | string"},"x_scale":{"oneOf":[{"type":"integer","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"X Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.x_scale","typeLabel":"integer | number | string"},"y_scale":{"oneOf":[{"type":"integer","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.0","typeLabel":"integer"},{"type":"number","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.1","typeLabel":"number"},{"type":"string","title":"Y Scale","default":"100%","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale.oneOf.2","typeLabel":"string"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.y_scale","typeLabel":"integer | number | string"},"flip_horizontal":{"type":"boolean","title":"Flip Horizontal","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_horizontal","typeLabel":"boolean"},"flip_vertical":{"type":"boolean","title":"Flip Vertical","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.flip_vertical","typeLabel":"boolean"},"opacity":{"type":"number","maximum":100,"minimum":0,"title":"Opacity","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.opacity","typeLabel":"number"},"z_index":{"oneOf":[{"type":"integer","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Z Index","description":"Stacking order among the frame's children (higher on top); ties draw in array order.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.z_index","typeLabel":"integer | null"},"clip":{"type":"boolean","title":"Clip","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.clip","typeLabel":"boolean"},"color_overlay":{"oneOf":[{"type":"string","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color Overlay","description":"**Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.color_overlay","typeLabel":"string | null"},"type":{"type":"string","const":"shape","title":"Type","default":"shape","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.type","typeLabel":"string"},"name":{"oneOf":[{"type":"string","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"Optional human-readable label. Not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.name","typeLabel":"string | null"},"track":{"oneOf":[{"type":"integer","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","maximum":255,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Track","description":"Timeline track index (0–255). Informational only; not used by the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.track","typeLabel":"integer | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Start in seconds on the clock the frame gives its children (the composition's, unless a composite frame maps it; inside a component, 0 is the instance's start). Omitted: the frame's start.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.time","typeLabel":"number | null"},"visible":{"type":"boolean","title":"Visible","description":"Set to `false` to skip this element without removing it from the request.","default":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.visible","typeLabel":"boolean"},"locked":{"type":"boolean","title":"Locked","description":"Marks the element locked in editors. Not sent to the renderer.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.locked","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","minimum":0,"exclusiveMinimum":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Seconds visible. Omitted: until the frame ends.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.duration","typeLabel":"number | null"},"path":{"oneOf":[{"type":"string","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","minLength":1,"example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"SVG path `d` (M L H V C S Q T A Z; elliptical arcs render as arcs). **Required** unless `geometry` is set.","example":"M50 0 L100 100 L0 100 Z","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path","typeLabel":"string | null"},"geometry":{"oneOf":[{"type":"object","title":"ShapeGeometry","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","properties":{"rect":{"oneOf":[{"type":"object","title":"GeometryRect","description":"A rectangle filling the element box, optionally with rounded corners.","properties":{"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"array","items":{"type":"number","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1.items.[INDEX]","typeLabel":"number"},"title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","maxItems":4,"minItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.1","typeLabel":"number[]"},{"type":"object","title":"GeometryCornerRadii","description":"Per-corner radii in px; a corner left out is 0.","properties":{"top_left":{"type":"any","title":"Top Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_left","typeLabel":"any"},"top_right":{"type":"any","title":"Top Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.top_right","typeLabel":"any"},"bottom_right":{"type":"any","title":"Bottom Right","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_right","typeLabel":"any"},"bottom_left":{"type":"any","title":"Bottom Left","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2.bottom_left","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.2","typeLabel":"GeometryCornerRadii · object"},{"type":"null","title":"Corner Radius","description":"Corner radius in px: one number for all four corners, `[top_left, top_right, bottom_right, bottom_left]`, or `{top_left, top_right, bottom_right, bottom_left}` (missing corners 0). Omitted: square corners.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius.oneOf.3","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.corner_radius","typeLabel":"number | number[] | GeometryCornerRadii · object | null"},"smoothing":{"oneOf":[{"type":"number","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Smoothing","description":"Figma's corner smoothing, 0 to 1: above 0 the corners ease into the edges (a squircle at 1). Omitted: 0, the plain rounded rect.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0.smoothing","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.0","typeLabel":"GeometryRect · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.rect","typeLabel":"GeometryRect · object | null"},"ellipse":{"oneOf":[{"type":"object","title":"GeometryEllipse","description":"The ellipse inscribed in the element box (a circle when the box is square).","properties":{},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.0","typeLabel":"GeometryEllipse · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ellipse","typeLabel":"GeometryEllipse · object | null"},"line":{"oneOf":[{"type":"object","title":"GeometryLine","description":"A straight line painted with the shape's `stroke` (else its `fill`).\n\nEndpoints are px from the element box's top-left corner; the width is\n`stroke_width` and the ends are `stroke_linecap`. Endpoints left out give\nthe box's horizontal centre line.","properties":{"x1":{"oneOf":[{"type":"number","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.0","typeLabel":"number"},{"type":"null","title":"X1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x1","typeLabel":"number | null"},"y1":{"oneOf":[{"type":"number","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y1","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y1","typeLabel":"number | null"},"x2":{"oneOf":[{"type":"number","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.0","typeLabel":"number"},{"type":"null","title":"X2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.x2","typeLabel":"number | null"},"y2":{"oneOf":[{"type":"number","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y2","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0.y2","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.0","typeLabel":"GeometryLine · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.line","typeLabel":"GeometryLine · object | null"},"ring":{"oneOf":[{"type":"object","title":"GeometryRing","description":"A ring, arc, pie or segmented ring: circular, inscribed in the box's shorter side.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.ring","typeLabel":"GeometryRing · object | null"},"arc":{"oneOf":[{"type":"object","title":"GeometryRing","description":"The same parameters as `ring`.","properties":{"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The hole's share of the radius, 0–1 (0 is a pie). Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio","typeLabel":"number | null"},"inner_ratio_percent":{"oneOf":[{"type":"number","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio Percent","description":"`inner_ratio` as a percent (85 is 0.85).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.inner_ratio_percent","typeLabel":"number | null"},"start_angle":{"oneOf":[{"type":"number","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start Angle","description":"Where the sweep starts, degrees, 0 at 3 o'clock, clockwise. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.start_angle","typeLabel":"number | null"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Degrees drawn clockwise from `start_angle`. Omitted: 360. With `segments` the sweep is theirs, so leave it out.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"`sweep` as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.sweep_percent","typeLabel":"number | null"},"cap":{"oneOf":[{"type":"string","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","enum":["butt","round"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Cap","description":"Ends of a partial sweep. Omitted: `butt`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.cap","typeLabel":"enum\u003cstring> | null"},"segments":{"oneOf":[{"type":"array","items":{"properties":{"fill":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Fill","description":"The slice's solid colour.","example":"#2a85ff","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].fill","typeLabel":"string"},"sweep":{"oneOf":[{"type":"number","title":"Sweep","description":"Slice angle in degrees.","maximum":360,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep","description":"Slice angle in degrees.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep","typeLabel":"number | null"},"sweep_percent":{"oneOf":[{"type":"number","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.0","typeLabel":"number"},{"type":"null","title":"Sweep Percent","description":"Slice as a percent of the full circle (100 = 360°).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX].sweep_percent","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["fill"],"title":"GeometrySegment","description":"One solid-coloured slice of a segmented ring, drawn after the previous one.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0.items.[INDEX]","typeLabel":"GeometrySegment · object"},"title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","maxItems":32,"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.0","typeLabel":"GeometrySegment · object[]"},{"type":"null","title":"Segments","description":"Consecutive solid slices (at most 32, together at most 360°) drawn as one shape, so abutting slices leave no seam.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0.segments","typeLabel":"GeometrySegment · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.0","typeLabel":"GeometryRing · object"},{"type":"null","description":"The same parameters as `ring`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.arc","typeLabel":"GeometryRing · object | null"},"polygon":{"oneOf":[{"type":"object","title":"GeometryPolygon","description":"A regular polygon inscribed in the ellipse the box holds, its first vertex at 12\no'clock.","properties":{"sides":{"oneOf":[{"type":"integer","title":"Sides","description":"Vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sides","description":"Vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.sides","typeLabel":"integer | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.0","typeLabel":"GeometryPolygon · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.polygon","typeLabel":"GeometryPolygon · object | null"},"star":{"oneOf":[{"type":"object","title":"GeometryStar","description":"A star: `points` outer vertices on the ellipse the box holds (the first at 12\no'clock), alternating with inner ones on that ellipse scaled by `inner_ratio`.","properties":{"points":{"oneOf":[{"type":"integer","title":"Points","description":"Outer vertices. Omitted: 5.","maximum":60,"minimum":3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Points","description":"Outer vertices. Omitted: 5.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.points","typeLabel":"integer | null"},"inner_ratio":{"oneOf":[{"type":"number","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Inner Ratio","description":"The inner vertices' share of the outer ellipse. Omitted: 0.382, a regular pentagram's.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.inner_ratio","typeLabel":"number | null"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.0","typeLabel":"number"},{"type":"null","title":"Corner Radius","description":"Rounds every vertex with an arc of this radius in px. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0.corner_radius","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.0","typeLabel":"GeometryStar · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.star","typeLabel":"GeometryStar · object | null"},"stroke_align":{"oneOf":[{"type":"string","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","enum":["inside","center","outside"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Stroke Align","description":"Where the stroke sits on the outline (`centre` is read as `center`). Omitted: `center`. A polygon, a star and a smoothed rect stroke centred.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.stroke_align","typeLabel":"enum\u003cstring> | null"},"shadows":{"oneOf":[{"type":"array","items":{"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].color","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Omitted: `drop`.","enum":["drop","inner"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Type","description":"Omitted: `drop`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"x":{"oneOf":[{"type":"number","title":"X","description":"Horizontal offset in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.0","typeLabel":"number"},{"type":"null","title":"X","description":"Horizontal offset in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].x","typeLabel":"number | null"},"y":{"oneOf":[{"type":"number","title":"Y","description":"Vertical offset in px, down positive.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.0","typeLabel":"number"},{"type":"null","title":"Y","description":"Vertical offset in px, down positive.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].y","typeLabel":"number | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"CSS blur radius in px (sigma = blur / 2).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].blur","typeLabel":"number | null"},"spread":{"oneOf":[{"type":"number","title":"Spread","description":"Spread in px.","maximum":100000,"minimum":-100000,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spread","description":"Spread in px.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX].spread","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["color"],"title":"GeometryShadow","description":"A CSS-style box shadow on a rect or circle geometry, in px, each length within\n+-100000.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0.items.[INDEX]","typeLabel":"GeometryShadow · object"},"title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","maxItems":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.0","typeLabel":"GeometryShadow · object[]"},{"type":"null","title":"Shadows","description":"Up to 4 shadows, the first on top, on a rect or an ellipse drawn as a circle.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0.shadows","typeLabel":"GeometryShadow · object[] | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.0","typeLabel":"ShapeGeometry · object"},{"type":"null","description":"Draw a closed-form shape instead of a `path`: exactly one of `rect` (`corner_radius` per corner, `smoothing`), `ellipse`, `line`, `ring` or `arc` (`inner_ratio`, `start_angle`, `sweep`, `cap`, `segments`), `polygon` (`sides`, `corner_radius`) or `star` (`points`, `inner_ratio`, `corner_radius`), plus `stroke_align` and `shadows`. Lengths are px, angles degrees clockwise from 3 o'clock. The box, `fill`, `stroke`, `stroke_width`, `stroke_dash`, motion, masks, mattes, blend modes and effects work as on any shape; `path`, `path_keyframes`, `trim`, `corner_radius` and `shadow` do not apply.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.geometry","typeLabel":"ShapeGeometry · object | null"},"view_box":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"View Box","description":"`[x, y, width, height]` path coordinate space.","default":[0,0,100,100],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.view_box","typeLabel":"number[]"},"fill":{"oneOf":[{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.0","typeLabel":"string"},{"type":"string","title":"Fill","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","const":"none","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.1","typeLabel":"string"},{"type":"string","title":"Fill","description":"CSS gradient shorthand — `linear-gradient(...)` or `radial-gradient(...)`. Normalised to the Gradient object during validation; the renderer never sees a CSS string, and reading the composition back returns the object.","default":"#000000","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.2","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Fill: a hex colour (alpha ok), `\"none\"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.","default":"#000000","required":["stops"],"example":"linear-gradient(90deg, #e07a4f 0%, #7c3aed 100%)","properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill.oneOf.3","typeLabel":"Gradient · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill","typeLabel":"string · string · string · Gradient · object"},"fill_rule":{"type":"string","enum":["nonzero","evenodd"],"title":"Fill Rule","default":"nonzero","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.fill_rule","typeLabel":"enum\u003cstring>"},"stroke":{"oneOf":[{"type":"string","title":"Stroke","description":"Stroke colour.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.0","typeLabel":"string"},{"type":"null","title":"Stroke","description":"Stroke colour.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke","typeLabel":"string | null"},"stroke_width":{"oneOf":[{"type":"number","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","maximum":100000,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stroke Width","description":"Stroke width in viewBox units, at most 100000 (absent = SVG 1.0; 0 disables).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_width","typeLabel":"number | null"},"stroke_linecap":{"type":"string","enum":["butt","round","square"],"title":"Stroke Linecap","description":"Cap on the open ends of a stroked path (SVG `stroke-linecap`): `butt` stops at the endpoint, `round` and `square` extend it by half the stroke width. Closed paths have joins, not caps.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linecap","typeLabel":"enum\u003cstring>"},"stroke_linejoin":{"type":"string","enum":["miter","round","bevel"],"title":"Stroke Linejoin","description":"Corner join of a stroked path (SVG `stroke-linejoin`): `miter` is the sharp corner (subject to `stroke_miter_limit`), `bevel` cuts it flat.","default":"round","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_linejoin","typeLabel":"enum\u003cstring>"},"stroke_miter_limit":{"type":"number","minimum":1,"title":"Stroke Miter Limit","description":"SVG `stroke-miterlimit`: miter length over stroke width. A `miter` join sharper than this falls back to `bevel`.","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_miter_limit","typeLabel":"number"},"stroke_dash":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Stroke Dash","description":"Dash pattern in viewBox units, SVG `stroke-dasharray` semantics: `[on, off, ...]` of any length — an odd-length array repeats so on/off alternate (`[4]` is 4 on, 4 off). Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash","typeLabel":"number[] | null"},"stroke_dash_offset":{"type":"number","title":"Stroke Dash Offset","description":"Where the dash pattern starts along the path, in viewBox units (SVG `stroke-dashoffset`): positive shifts the pattern forward, negative backward.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset","typeLabel":"number"},"stroke_dash_offset_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"offset":{"type":"number","title":"Offset","description":"Dash offset at this time, in viewBox units (SVG `stroke-dashoffset`).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].offset","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","offset"],"title":"DashOffsetKeyframe","description":"A keyframe on the dash offset (marching ants).\n\n``offset`` is the whole SVG ``stroke-dashoffset`` at ``time`` in the same\nviewBox units as the static ``stroke_dash_offset`` — nothing inherits on\nthis channel, there is one value to animate.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0.items.[INDEX]","typeLabel":"DashOffsetKeyframe · object"},"title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.0","typeLabel":"DashOffsetKeyframe · object[]"},{"type":"null","title":"Stroke Dash Offset Keyframes","description":"Animate the dash offset (timeline seconds) — marching ants: keyframe `offset` linearly by one dash period (the pattern's sum) per second. Needs a `stroke_dash`; while present it drives the offset in place of the static `stroke_dash_offset`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_dash_offset_keyframes","typeLabel":"DashOffsetKeyframe · object[] | null"},"stroke_marker_start":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker Start","description":"A head at the start of each open subpath, in the stroke's colour (render-node V2.6): `triangle` is filled, its tip on the endpoint (the shaft shortens to meet it); `open_chevron` is an open head stroked like the path; `dot` is a disc. Placed after the trim, so a draw-on keeps its head at the visible end, and left out of the dash. A closed subpath takes none. Needs a `stroke`; path shapes only.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_start","typeLabel":"enum\u003cstring>"},"stroke_marker_end":{"type":"string","enum":["none","triangle","open_chevron","dot"],"title":"Stroke Marker End","description":"A head at the end of each open subpath; see `stroke_marker_start`.","default":"none","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_end","typeLabel":"enum\u003cstring>"},"stroke_marker_size":{"type":"number","maximum":32,"minimum":1,"title":"Stroke Marker Size","description":"Marker length in stroke widths, 1–32 (4 is four times `stroke_width`).","default":4,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.stroke_marker_size","typeLabel":"number"},"corner_radius":{"oneOf":[{"type":"number","title":"Corner Radius","description":"Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.","default":0,"maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.0","typeLabel":"number"},{"type":"object","title":"CornerRadii","description":"Per-corner radii, each normalized 0–1 (1 = fully round on the shorter side).","default":0,"properties":{"top_left":{"type":"number","maximum":1,"minimum":0,"title":"Top Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_left","typeLabel":"number"},"top_right":{"type":"number","maximum":1,"minimum":0,"title":"Top Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.top_right","typeLabel":"number"},"bottom_right":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Right","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_right","typeLabel":"number"},"bottom_left":{"type":"number","maximum":1,"minimum":0,"title":"Bottom Left","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1.bottom_left","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius.oneOf.1","typeLabel":"CornerRadii · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.corner_radius","typeLabel":"number | CornerRadii · object"},"shadow":{"oneOf":[{"type":"object","title":"DropShadow","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","required":["color"],"properties":{"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","example":"#00000066","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.color","typeLabel":"string"},"distance":{"type":"number","minimum":0,"title":"Distance","description":"Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.distance","typeLabel":"number"},"direction":{"type":"number","title":"Direction","description":"Shadow direction in degrees (polar; 90 = down).","default":90,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.direction","typeLabel":"number"},"blur":{"type":"number","minimum":0,"title":"Blur","description":"Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0.blur","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.0","typeLabel":"DropShadow · object"},{"type":"null","description":"Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.shadow","typeLabel":"DropShadow · object | null"},"path_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds for this path.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"d":{"type":"string","minLength":1,"title":"D","description":"SVG path `d` at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].d","typeLabel":"string"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time","d"],"title":"PathKeyframe","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0.items.[INDEX]","typeLabel":"PathKeyframe · object"},"title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.0","typeLabel":"PathKeyframe · object[]"},{"type":"null","title":"Path Keyframes","description":"Morph the path between keyframes (timeline seconds).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.path_keyframes","typeLabel":"PathKeyframe · object[] | null"},"trim":{"oneOf":[{"type":"object","title":"TrimPath","description":"Static trim window: keep only this arc-length fraction of each subpath.","properties":{"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Trim start, 0–1 along the path.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Trim end, 0–1 along the path.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0.end","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.0","typeLabel":"TrimPath · object"},{"type":"null","description":"Static trim window: keep only this arc-length fraction of each subpath.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim","typeLabel":"TrimPath · object | null"},"trim_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"start":{"oneOf":[{"type":"number","title":"Start","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.0","typeLabel":"number"},{"type":"null","title":"Start","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].start","typeLabel":"number | null"},"end":{"oneOf":[{"type":"number","title":"End","maximum":1,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.0","typeLabel":"number"},{"type":"null","title":"End","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].end","typeLabel":"number | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Ease into this keyframe.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Ease into this keyframe.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].easing","typeLabel":"enum\u003cstring> | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"TrimKeyframe","description":"A keyframe on the trim window (draw-on, §5b).\n\nAbsent ``start``/``end`` inherit the static ``trim`` values, so animating\n``end`` 0→1 on a stroked path draws it on while ``start`` stays put.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0.items.[INDEX]","typeLabel":"TrimKeyframe · object"},"title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.0","typeLabel":"TrimKeyframe · object[]"},{"type":"null","title":"Trim Keyframes","description":"Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.trim_keyframes","typeLabel":"TrimKeyframe · object[] | null"},"effects":{"items":{"properties":{"type":{"oneOf":[{"type":"string","title":"EffectType","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","enum":["vintage","polaroid","portra","super8","filmic","add_grain","rgb_split","ghosting","displacement_map","posterize","mosaic","mosaic_blur","mosaic_posterize","cc_halftone","cc_halftone_blue","cc_halftone_green","cc_halftone_red","invert","optics_compensation","viewfinder","night_vision","thermal","camera_lens_blur","camera_lens_blur_bg","box_blur","lens_flare","strobe_light","snow","glow","sepia","echo","chromatic_aberration","vhs","vhs_overlay","crt","television","glitch","compression_glitch","scanlines","prism","light_leaks","film_burn","duotone","cross_process","bleach_bypass","chroma_key","aurora"],"x-enumDescriptions":{"vintage":"Faded, warm retro film look with lifted blacks.","polaroid":"Instant-photo look — soft contrast, warm cast, subtle vignette.","portra":"Kodak Portra-style film emulation with natural skin tones.","super8":"Super-8 home-movie look — grain, gate weave, warm color.","filmic":"Cinematic film grade with rolled-off highlights and rich contrast.","add_grain":"Adds dusty analog film grain over the image.","rgb_split":"Offsets the red/green/blue channels for a glitchy chromatic split.","ghosting":"Trailing motion echoes, like persistence-of-vision smearing.","displacement_map":"Warps the image with a displacement texture for a melted look.","posterize":"Reduces the image to a small number of flat color bands.","mosaic":"Pixelates the image into large mosaic blocks.","mosaic_blur":"Pixelated mosaic with softened, blurred block edges.","mosaic_posterize":"Combines mosaic pixelation with posterized colors.","cc_halftone":"Comic-style halftone dot pattern.","cc_halftone_blue":"Halftone dot pattern tinted blue.","cc_halftone_green":"Halftone dot pattern tinted green.","cc_halftone_red":"Halftone dot pattern tinted red.","invert":"Inverts all colors (photo-negative).","optics_compensation":"Fish-eye / lens-distortion warp.","viewfinder":"Camera viewfinder overlay (REC indicator, framing marks).","night_vision":"Green night-vision look with glow and noise.","thermal":"Thermal-camera false-color heat map.","camera_lens_blur":"Realistic bokeh lens blur across the frame.","camera_lens_blur_bg":"Bokeh lens blur applied to the background only.","box_blur":"Fast, uniform box blur.","lens_flare":"Adds an anamorphic lens-flare streak and glints.","strobe_light":"Rapid brightness strobing / flashing.","snow":"Falling-snow particle overlay.","glow":"Dreamy soft-glow bloom over highlights.","sepia":"Sepia-toned monochrome with a vignette.","echo":"Soft ghosted dream-echo overlay.","chromatic_aberration":"Color-fringing at edges, like cheap-lens dispersion.","vhs":"VHS tape look: tracking noise, color bleed, and wobble.","vhs_overlay":"VHS noise/scanline layer composited over the source.","crt":"CRT monitor look: screen curvature, scanlines, and phosphor glow.","television":"Analog TV look: scanlines, static, and signal distortion.","glitch":"Digital glitch: block displacement and channel tearing.","compression_glitch":"MPEG compression artifacts: blocky macroblocks and datamosh.","scanlines":"Horizontal scanlines overlaid on the image.","prism":"Prismatic light refraction with a rainbow color split.","light_leaks":"Warm light-leak streaks bleeding across the frame.","film_burn":"Burning-film look with scorched edges and flares.","duotone":"Two-tone color map (shadows to one hue, highlights to another).","cross_process":"Cross-processed film look with shifted, punchy colors.","bleach_bypass":"High-contrast, desaturated bleach-bypass film grade.","chroma_key":"Keys out a color (green/blue screen); tune via `chroma_settings`.","aurora":"Animated domain-warped fluid-gradient wash (§6); tune flow via `props` speed."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The effect from the vocabulary (`effects` in GET /v1/capabilities). Omit it beside `shader`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"intensity":{"oneOf":[{"type":"number","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"maximum":100,"minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Intensity","description":"Effect strength, 0 to 100. On a shader effect it is null unless set: the shader then runs at the engine's own full intensity rather than the effect-wide 50.","default":50,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity","typeLabel":"number | null"},"intensity_keyframes":{"oneOf":[{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].time","typeLabel":"number"},"value":{"type":"number","maximum":1,"minimum":0,"title":"Value","description":"Effect intensity 0–1 at this time.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX].value","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"IntensityKeyframe","description":"A point on a keyframed effect-intensity ramp (§2). Absolute timeline seconds.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0.items.[INDEX]","typeLabel":"IntensityKeyframe · object"},"title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.0","typeLabel":"IntensityKeyframe · object[]"},{"type":"null","title":"Intensity Keyframes","description":"Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].intensity_keyframes","typeLabel":"IntensityKeyframe · object[] | null"},"props":{"oneOf":[{"type":"object","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","additionalProperties":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0.additionalProperties","typeLabel":"number"},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.0","typeLabel":"Props · object"},{"type":"null","title":"Props","description":"Per-shader scalar props (§2), bound as `u_prop_\u003ckey>` (e.g. `{\"speed\": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].props","typeLabel":"Props · object | null"},"chroma_settings":{"oneOf":[{"type":"object","title":"ChromaKeyProps","description":"Used when ``EffectType.CHROMA_KEY`` is selected.\n\nKeys against an explicit key **colour** in the YCbCr chroma plane, which is\nluma-independent, so shadows falling on the screen key out along with it.\n\nThis replaced an hue/saturation/luminance-window shape that could not work. It\nwas wired to ``effect_chroma.frag``, whose ``sensitivity`` is\n``(hueMax - hueMin) * 0.5`` compared against an Oklab distance bounded around\n0..0.9 — so the old defaults (60/180) produced a sensitivity of 60, discarded\nevery pixel, and made the element vanish from the render. Nothing could have\ndepended on the previous shape, because nothing rendered with it.","properties":{"key_color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Key Color","description":"The colour to key out. Green-screen green by default.","default":"#00FF00","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.key_color","typeLabel":"string"},"threshold":{"type":"number","maximum":1,"minimum":0,"title":"Threshold","description":"Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.","default":0.1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.threshold","typeLabel":"number"},"smoothness":{"type":"number","maximum":1,"minimum":0,"title":"Smoothness","description":"Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.","default":0.15,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.smoothness","typeLabel":"number"},"spill_suppress":{"type":"number","maximum":1,"minimum":0,"title":"Spill Suppress","description":"How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0.spill_suppress","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.0","typeLabel":"ChromaKeyProps · object"},{"type":"null","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].chroma_settings","typeLabel":"ChromaKeyProps · object | null"},"shader":{"oneOf":[{"type":"object","title":"EffectShader","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"title":"Id","description":"The shader's id (`sh_...`): one of this workspace's or a shared one (GET /v1/shaders).","example":"sh_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.id","typeLabel":"string"},"params":{"additionalProperties":{"oneOf":[{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.0","typeLabel":"number"},{"type":"string","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2.items.[INDEX]","typeLabel":"number"},"maxItems":2,"minItems":2,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.2","typeLabel":"number[]"},{"type":"array","items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute timeline seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].time","typeLabel":"number"},"value":{"oneOf":[{"type":"number","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","title":"Value","description":"The param's value at this time, of its type.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"number"},"title":"Value","description":"The param's value at this time, of its type.","maxItems":2,"minItems":2,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value.oneOf.2","typeLabel":"number[]"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX].value","typeLabel":"number | string | number[]"}},"additionalProperties":false,"type":"object","required":["time","value"],"title":"ShaderParamKeyframe","description":"A point on a runtime shader param's track (AEC §2): linear between, held outside.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3.items.[INDEX]","typeLabel":"ShaderParamKeyframe · object"},"minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties.oneOf.3","typeLabel":"ShaderParamKeyframe · object[]"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params.additionalProperties","typeLabel":"number | string | number[] | ShaderParamKeyframe · object[]"},"type":"object","title":"Params","description":"Values of the shader's declared params by name: a number (`float`), \"#RRGGBBAA\" (`color`) or [x, y] (`vec2`), or keyframes `[{time, value}]` in timeline seconds. A param left out takes its declared default.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0.params","typeLabel":"Params · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.0","typeLabel":"EffectShader · object"},{"type":"null","description":"A runtime shader in place of `type` (render-node AEC §2): `{id, params}`, with `intensity` beside it and nothing else. Authoring: `shaders` in GET /v1/capabilities.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX].shader","typeLabel":"EffectShader · object | null"}},"additionalProperties":false,"type":"object","title":"Effect","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects.items.[INDEX]","typeLabel":"Effect · object"},"type":"array","title":"Effects","description":"Shader effect chain (§6 W3).","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.effects","typeLabel":"Effect · object[]"},"motion":{"items":{"properties":{"time":{"type":"number","minimum":0,"title":"Time","description":"Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].time","typeLabel":"number"},"duration":{"type":"number","exclusiveMinimum":0,"title":"Duration","description":"How long the animation runs in seconds.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].duration","typeLabel":"number"},"type":{"oneOf":[{"type":"string","title":"MotionType","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","enum":["identity","fade","slide_up","slide_down","slide_left","slide_right","zoom_in","zoom_out","rotate_cw","rotate_ccw","bounce","wipe_left","wipe_right","wipe_up","wipe_down","ken_burns_in","ken_burns_out","ken_burns_in_out","loop_wiggle","loop_rotate","loop_rotate_smooth","loop_3d_spin","loop_3d_sway","blur","evaporate","overlay","difference","rubber_in","whip_up","whip_down","glitch_pop","drift_in","drift_out","loop_breathe","loop_shimmer","swing_in","swing_out","elastic_rise","elastic_drop","tilt_zoom","loop_orbit","smooth_pop"],"x-enumDescriptions":{"identity":"Deliberate no-op carrier (no visible motion): attach a pure `audio` generator to any element without animating it. Element surfaces only.","fade":"Fade in (entrance) or out (exit) via opacity.","slide_up":"Slide in from below / out upward.","slide_down":"Slide in from above / out downward.","slide_left":"Slide in from the right / out to the left.","slide_right":"Slide in from the left / out to the right.","zoom_in":"Scale up from small to full size (entrance).","zoom_out":"Scale down to small (exit).","rotate_cw":"Spin in/out clockwise.","rotate_ccw":"Spin in/out counter-clockwise.","bounce":"Bounce in with an elastic overshoot / bounce out.","wipe_left":"Reveal/conceal with a left-moving wipe.","wipe_right":"Reveal/conceal with a right-moving wipe.","wipe_up":"Reveal/conceal with an upward wipe.","wipe_down":"Reveal/conceal with a downward wipe.","ken_burns_in":"Slow zoom-in pan (Ken Burns) — entrance only.","ken_burns_out":"Slow zoom-out pan (Ken Burns) — entrance only.","ken_burns_in_out":"Slow zoom in then out (Ken Burns) — entrance only.","loop_wiggle":"Continuous subtle wiggle (looping).","loop_rotate":"Continuous stepped rotation (looping).","loop_rotate_smooth":"Continuous smooth rotation (looping).","loop_3d_spin":"Continuous 3D spin (looping).","loop_3d_sway":"Continuous 3D sway (looping).","blur":"Per-glyph soft blur-in (text entrance).","evaporate":"Per-glyph rise, blur, and fade-out (text exit only).","overlay":"Static Overlay blend fill (timing ignored).","difference":"Static Difference blend fill (timing ignored).","rubber_in":"Per-glyph rubbery overshoot as text springs in (text entrance).","whip_up":"Per-glyph whip upward into place (text entrance).","whip_down":"Per-glyph whip downward out of frame (text exit only).","glitch_pop":"Per-glyph glitchy pop-in with jitter (text entrance).","drift_in":"Per-glyph gentle drift and fade in (text entrance).","drift_out":"Per-glyph gentle drift and fade out (text exit only).","loop_breathe":"Per-glyph continuous breathing scale loop (text).","loop_shimmer":"Per-glyph continuous shimmer loop (text).","swing_in":"Element swings into place from an angle (entrance).","swing_out":"Element swings away out of frame (exit only).","elastic_rise":"Element rises with an elastic overshoot (entrance).","elastic_drop":"Element drops away with an elastic recoil (exit only).","tilt_zoom":"Element tilts and zooms into place (entrance).","loop_orbit":"Element orbits continuously around its center (loop).","smooth_pop":"Element pops in from 60% scale, overshooting slightly past full size before it settles, as it fades in (entrance)."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Catalog preset. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].type","typeLabel":"enum\u003cstring> | null"},"preset":{"oneOf":[{"type":"string","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.0","typeLabel":"string"},{"type":"null","title":"Preset","description":"Renderer animation name, used verbatim — any element animation on video/image/shape/group (e.g. `'pop'`, `'floatUp'`, `'out-slideBounceLeft'`, `'loop-heartBeat'`), any text animation on text (e.g. `'typewriter'`, `'roll'`, `'out-sink'`, `'loop-wavey'`). Reaches the presets `type` has no name for. The name carries its own direction: `out-*` names are exits, `loop-*` names loop with `duration` as one cycle, so `reversed` and `scope` do not apply. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].preset","typeLabel":"string | null"},"custom":{"oneOf":[{"type":"string","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.0","typeLabel":"string"},{"type":"null","title":"Custom","description":"Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type`, `preset` or `custom` must be set.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].custom","typeLabel":"string | null"},"easing":{"type":"string","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"title":"Easing","description":"**Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.","x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"default":"ease_in_out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].easing","typeLabel":"enum\u003cstring>"},"reversed":{"type":"boolean","title":"Reversed","description":"Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].reversed","typeLabel":"boolean"},"scope":{"type":"string","enum":["element","character"],"title":"MotionScope","description":"Whether a motion preset applies to the whole element or per-glyph (text only).\n\nValues:\n- `element` — The motion animates the whole element as one unit.\n- `character` — The motion animates each text glyph individually (text only).","x-enumDescriptions":{"element":"The motion animates the whole element as one unit.","character":"The motion animates each text glyph individually (text only)."},"default":"element","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].scope","typeLabel":"enum\u003cstring>"},"delay":{"type":"number","minimum":0,"title":"Delay","description":"Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].delay","typeLabel":"number"},"spacing":{"oneOf":[{"type":"number","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","minimum":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.0","typeLabel":"number"},{"type":"null","title":"Spacing","description":"Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].spacing","typeLabel":"number | null"},"loop":{"type":"boolean","title":"Loop","default":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].loop","typeLabel":"boolean"},"audio":{"oneOf":[{"type":"object","title":"AudioGenerator","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","properties":{"feature":{"type":"string","enum":["amplitude","bass","mid","high","beat"],"title":"Feature","default":"amplitude","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.feature","typeLabel":"enum\u003cstring>"},"scale":{"type":"number","title":"Scale","description":"Scale offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.scale","typeLabel":"number"},"opacity":{"type":"number","title":"Opacity","description":"Opacity offset per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.opacity","typeLabel":"number"},"translate":{"oneOf":[{"type":"object","title":"Point","description":"Translate offset per unit feature.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Translate offset per unit feature.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.translate","typeLabel":"Point · object | null"},"rotate":{"type":"number","title":"Rotate","description":"Rotation offset (degrees) per unit feature.","default":0,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0.rotate","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.0","typeLabel":"AudioGenerator · object"},{"type":"null","description":"Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: \"identity\"`, the engine's no-op carrier.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX].audio","typeLabel":"AudioGenerator · object | null"}},"additionalProperties":false,"type":"object","required":["time","duration"],"title":"Motion","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion.items.[INDEX]","typeLabel":"Motion · object"},"type":"array","title":"Motion","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3.motion","typeLabel":"Motion · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX].oneOf.3","typeLabel":"ChildShapeElement · object"},{},{}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object"},"type":"array","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots.additionalProperties","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object)[]"},"type":"object","title":"Slots","description":"Content for the component's slots, by slot name, in place of the slot frame's own children.","default":{},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5.slots","typeLabel":"Slots · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX].oneOf.5","typeLabel":"InstanceElement · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children.items.[INDEX]","typeLabel":"ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | FrameElement · object | InstanceElement · object"},"type":"array","title":"Children","description":"Its body, in design px from the box's top-left corner.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].children","typeLabel":"(ChildVideoElement · object | ChildTextElement · object | ChildImageElement · object | ChildShapeElement · object | FrameElement · object | InstanceElement · object)[]"},"operations":{"oneOf":[{"type":"object","title":"OperationsBlock","description":"Its operations; groups count from `instance.start` unless they say otherwise.","properties":{"markers":{"items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","example":"beat","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.markers.items.[INDEX].name","typeLabel":"string"},"time":{"type":"number","title":"Time","description":"Seconds on the composition clock.","example":1.5,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.markers.items.[INDEX].time","typeLabel":"number"}},"additionalProperties":false,"type":"object","required":["name","time"],"title":"OperationMarker","description":"A named time a `marker` anchor reads.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.markers.items.[INDEX]","typeLabel":"OperationMarker · object"},"type":"array","title":"Markers","description":"Named times `marker` anchors read.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.markers","typeLabel":"OperationMarker · object[]"},"groups":{"items":{"properties":{"ops":{"items":{"oneOf":[{"type":"object","title":"Operation","description":"One property driven over a window (GVR §4.3): the base value, then the replaces by\nstart, then the multiplies and the adds. It holds `to` after `end`.","required":["target","start","end","property"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.end","typeLabel":"number"},"property":{"type":"string","title":"Property","description":"A property registry path: `position.x`, `size.y`, `scale`, `rotation`, `opacity`, `fill`, `geometry.ring.segments[0].sweep`, `text.value`, …; a colour takes `.r`/`.g`/`.b`/`.a`. GET /v1/capabilities lists every path, its unit and range under `registry.properties`.","example":"geometry.ring.segments[0].sweep","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.property","typeLabel":"string"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.id","typeLabel":"string | null"},"from":{"oneOf":[{"type":"number","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.0","typeLabel":"number"},{"type":"string","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.1","typeLabel":"string"},{"type":"null","title":"From","description":"Value at `start` (a string on `text.value`). Omitted on a replace: the value below it at `start`; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from.oneOf.2","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.from","typeLabel":"number | string | null"},"to":{"oneOf":[{"type":"number","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.0","typeLabel":"number"},{"type":"string","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.1","typeLabel":"string"},{"type":"null","title":"To","description":"Value at `end`, held after it. Omitted on a replace: the live base value; on an add or multiply: the identity.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to.oneOf.2","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.to","typeLabel":"number | string | null"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"The engine's shared easing name map (Easing.cpp `StringToEasingType`).\n\nEvery name here resolves on every keyframe surface (morph/trim/mask/custom\nanimation keyframes, selector ``ease``, counter ``easing``). ``ease_in`` /\n``ease_out`` / ``ease_in_out`` are the AE/CSS aliases of the ``quad_*``\ncurves. ``square_*`` is a **step** family (``square_in_out`` snaps at the\nmidpoint), not a power curve — the quadratic curves are ``quad_*``.\n``hold`` freezes the prior value until the next keyframe.\n\nThe parameterized families (spring / back / elastic / bezier) are not\nnames: express them through the dedicated keyframe sub-objects.\n\nValues:\n- `linear` — Constant speed, no acceleration.\n- `hold` — Freeze the previous value until the next keyframe (step).\n- `ease_in` — Starts slow, accelerates (alias of quad_in).\n- `ease_out` — Starts fast, decelerates (alias of quad_out).\n- `ease_in_out` — Slow start and end, faster in the middle (alias of quad_in_out).\n- `sin_in` — Gentle sinusoidal acceleration in.\n- `sin_out` — Gentle sinusoidal deceleration out.\n- `sin_in_out` — Gentle sinusoidal ease both ends.\n- `square_in` — Step: snaps at the segment end (not a power curve).\n- `square_out` — Step: snaps at the segment start (not a power curve).\n- `square_in_out` — Step: snaps at the midpoint — the typewriter/glitch snap.\n- `expo_in` — Extreme exponential acceleration in.\n- `expo_out` — Extreme exponential deceleration out.\n- `expo_in_out` — Extreme exponential ease both ends.\n- `quad_in` — Quadratic acceleration in.\n- `quad_out` — Quadratic deceleration out.\n- `quad_in_out` — Quadratic ease both ends.\n- `cubic_in` — Cubic acceleration in (stronger than quad).\n- `cubic_out` — Cubic deceleration out (stronger than quad).\n- `cubic_in_out` — Cubic ease both ends.\n- `quart_in` — Quartic acceleration in.\n- `quart_out` — Quartic deceleration out.\n- `quart_in_out` — Quartic ease both ends.\n- `quint_in` — Quintic acceleration in (near-expo).\n- `quint_out` — Quintic deceleration out (near-expo).\n- `quint_in_out` — Quintic ease both ends.","enum":["linear","hold","ease_in","ease_out","ease_in_out","sin_in","sin_out","sin_in_out","square_in","square_out","square_in_out","expo_in","expo_out","expo_in_out","quad_in","quad_out","quad_in_out","cubic_in","cubic_out","cubic_in_out","quart_in","quart_out","quart_in_out","quint_in","quint_out","quint_in_out"],"x-enumDescriptions":{"linear":"Constant speed, no acceleration.","hold":"Freeze the previous value until the next keyframe (step).","ease_in":"Starts slow, accelerates (alias of quad_in).","ease_out":"Starts fast, decelerates (alias of quad_out).","ease_in_out":"Slow start and end, faster in the middle (alias of quad_in_out).","sin_in":"Gentle sinusoidal acceleration in.","sin_out":"Gentle sinusoidal deceleration out.","sin_in_out":"Gentle sinusoidal ease both ends.","square_in":"Step: snaps at the segment end (not a power curve).","square_out":"Step: snaps at the segment start (not a power curve).","square_in_out":"Step: snaps at the midpoint — the typewriter/glitch snap.","expo_in":"Extreme exponential acceleration in.","expo_out":"Extreme exponential deceleration out.","expo_in_out":"Extreme exponential ease both ends.","quad_in":"Quadratic acceleration in.","quad_out":"Quadratic deceleration out.","quad_in_out":"Quadratic ease both ends.","cubic_in":"Cubic acceleration in (stronger than quad).","cubic_out":"Cubic deceleration out (stronger than quad).","cubic_in_out":"Cubic ease both ends.","quart_in":"Quartic acceleration in.","quart_out":"Quartic deceleration out.","quart_in_out":"Quartic ease both ends.","quint_in":"Quintic acceleration in (near-expo).","quint_out":"Quintic deceleration out (near-expo).","quint_in_out":"Quintic ease both ends."},"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"object","title":"EaseFamily","description":"One of the engine's twelve easing families at an intensity (GVR M3).","required":["family","intensity"],"properties":{"family":{"type":"string","enum":["smooth","natural","slowdown","accelerate","overshoot","anticipate","anticipate_overshoot","spring","elastic","bounce","impulse","throw"],"title":"Family","description":"The curve's character.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.family","typeLabel":"enum\u003cstring>"},"intensity":{"type":"number","maximum":100,"minimum":0,"title":"Intensity","description":"How strongly, 0 to 100.","example":65,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1.intensity","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.1","typeLabel":"EaseFamily · object"},{"type":"object","title":"EaseBezier","description":"A CSS cubic-bezier curve.","required":["bezier"],"properties":{"bezier":{"items":{"type":"number","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier.items.[INDEX]","typeLabel":"number"},"type":"array","maxItems":4,"minItems":4,"title":"Bezier","description":"`[x1, y1, x2, y2]`, as CSS `cubic-bezier`.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2.bezier","typeLabel":"number[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.2","typeLabel":"EaseBezier · object"},{"type":"object","title":"EaseSpring","description":"A damped spring over the window.","required":["spring"],"properties":{"spring":{"properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring.mass","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3.spring","typeLabel":"SpringEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.3","typeLabel":"EaseSpring · object"},{"type":"object","title":"EaseBack","description":"An anticipate or overshoot ease (AE 'back').","required":["back"],"properties":{"back":{"properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4.back","typeLabel":"BackEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.4","typeLabel":"EaseBack · object"},{"type":"object","title":"EaseElastic","description":"An elastic ring-in or ring-out ease.","required":["elastic"],"properties":{"elastic":{"properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5.elastic","typeLabel":"ElasticEasing · object"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.5","typeLabel":"EaseElastic · object"},{"type":"null","title":"Easing","description":"A curve name (`ease_in_out`, `hold`, …), `{family, intensity}`, or one of `{bezier: [x1, y1, x2, y2]}`, `{spring}`, `{back}`, `{elastic}`. Omitted: linear.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing.oneOf.6","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.easing","typeLabel":"enum\u003cstring> | EaseFamily · object | EaseBezier · object | EaseSpring · object | EaseBack · object | EaseElastic · object | null"},"composite":{"oneOf":[{"type":"string","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","enum":["replace","add","multiply"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Composite","description":"`replace` overrides what is below it from `start`; `add` and `multiply` stack on it (multiply on scale, opacity and colours). Omitted: `replace`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.composite","typeLabel":"enum\u003cstring> | null"},"split":{"oneOf":[{"type":"object","title":"OperationSplit","description":"Run it per child, letter, word or line, staggered.","required":["unit"],"properties":{"unit":{"type":"string","enum":["element","child","letter","word","line"],"title":"Unit","description":"`child` runs over a frame's children; `letter`, `word` and `line` over a text's.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.unit","typeLabel":"enum\u003cstring>"},"stagger":{"oneOf":[{"type":"number","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.0","typeLabel":"number"},{"type":"null","title":"Stagger","description":"Seconds between units. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.stagger","typeLabel":"number | null"},"order":{"oneOf":[{"type":"string","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","enum":["forward","reverse","centre","edges","seeded"],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Order","description":"The order the units take their turns in. Omitted: `forward`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0.order","typeLabel":"enum\u003cstring> | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.0","typeLabel":"OperationSplit · object"},{"type":"null","description":"Run it per child, letter, word or line, staggered.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.split","typeLabel":"OperationSplit · object | null"},"takeover":{"oneOf":[{"type":"string","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","const":"velocity","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.0","typeLabel":"string"},{"type":"null","title":"Takeover","description":"On a replace without `from`: start at the speed of what it replaces.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0.takeover","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.0","typeLabel":"Operation · object"},{"type":"object","title":"PresetOperation","description":"An element preset run as operations over the window (GVR §4.3 item 10).","required":["target","start","end","preset"],"properties":{"target":{"type":"string","minLength":1,"title":"Target","description":"The element id it drives; with a `child` split, a frame's.","example":"donut","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.target","typeLabel":"string"},"start":{"type":"number","title":"Start","description":"Seconds after the group's anchor.","example":0,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.start","typeLabel":"number"},"end":{"type":"number","title":"End","description":"Seconds after the group's anchor; equal to `start` switches at once.","example":1,"isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.end","typeLabel":"number"},"preset":{"type":"string","enum":["arcRise","bounceIn","drop","elasticRise","fade","floatDown","floatLeft","floatRight","floatUp","gentleFloatDown","gentleFloatLeft","gentleFloatRight","gentleFloatUp","identity","kenBurnsIn","kenBurnsInOut","kenBurnsOut","loop-3DSpin","loop-3DSway","loop-bounce","loop-heartBeat","loop-jiggle","loop-orbit","loop-rotateBasic","loop-rotateSmooth","loop-squeezy","loop-sway","out-bounceOut","out-dropOut","out-elasticDrop","out-fade","out-floatDown","out-floatLeft","out-floatRight","out-floatUp","out-gentleFloatDown","out-gentleFloatLeft","out-gentleFloatRight","out-gentleFloatUp","out-pop","out-slideBounceDown","out-slideBounceLeft","out-slideBounceRight","out-slideBounceUp","out-slideDown","out-slideLeft","out-slideRight","out-slideUp","out-spinAntiClockwise","out-spinClockwise","out-swingOut","out-wipeDown","out-wipeLeft","out-wipeRight","out-wipeUp","out-zoomOut","pop","slideBounceDown","slideBounceLeft","slideBounceRight","slideBounceUp","slideDown","slideLeft","slideRight","slideUp","smoothPop","spinAntiClockwise","spinClockwise","springPop","swingIn","tiltZoom","wipeDown","wipeLeft","wipeRight","wipeUp","zoomIn"],"title":"Preset","description":"An element preset by the engine's name (`slideUp`, `zoomIn`, `fade`, …). Text presets stay on a text's `motion`.","example":"zoomIn","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.preset","typeLabel":"enum\u003cstring>"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1.id","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX].oneOf.1","typeLabel":"PresetOperation · object"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops.items.[INDEX]","typeLabel":"Operation · object | PresetOperation · object"},"type":"array","title":"Ops","description":"Operations and presets in document order: at equal starts the later replace wins.","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].ops","typeLabel":"(Operation · object | PresetOperation · object)[]"},"id":{"oneOf":[{"type":"string","title":"Id","description":"A stable id for editors.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Id","description":"A stable id for editors.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"A label, e.g. `Animate in`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].name","typeLabel":"string | null"},"role":{"oneOf":[{"type":"string","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role.oneOf.0","typeLabel":"string"},{"type":"null","title":"Role","description":"What the group is for in editors (`in`, `out`, `loop`, …). Not sent to the renderer.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].role","typeLabel":"string | null"},"anchor":{"oneOf":[{"type":"object","title":"OperationAnchor","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","required":["ref"],"properties":{"ref":{"type":"string","enum":["composition","element.start","element.end","marker","instance.start"],"title":"Ref","description":"`composition` (0 s), `element.start` or `element.end` of `target`, a marker by `name`, or `instance.start` of `target` (in a component, its own instance).","isRequired":true,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.ref","typeLabel":"enum\u003cstring>"},"target":{"oneOf":[{"type":"string","title":"Target","description":"The element or instance an element or instance anchor reads.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target","description":"The element or instance an element or instance anchor reads.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.target","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","description":"The marker a `marker` anchor reads.","minLength":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","description":"The marker a `marker` anchor reads.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.name","typeLabel":"string | null"},"offset":{"oneOf":[{"type":"number","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.0","typeLabel":"number"},{"type":"null","title":"Offset","description":"Seconds added to the anchor. Omitted: 0.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0.offset","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.0","typeLabel":"OperationAnchor · object"},{"type":"null","description":"Where its times count from. Required in the request's `operations`; a component's groups default to `instance.start`.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX].anchor","typeLabel":"OperationAnchor · object | null"}},"additionalProperties":false,"type":"object","required":["ops"],"title":"OperationGroup","description":"Operations sharing one anchor (GVR §4.3).","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups.items.[INDEX]","typeLabel":"OperationGroup · object"},"type":"array","maxItems":1000,"title":"Groups","description":"At most 1000 groups and 10000 operations.","default":[],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0.groups","typeLabel":"OperationGroup · object[]"}},"additionalProperties":false,"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.0","typeLabel":"OperationsBlock · object"},{"type":"null","description":"Its operations; groups count from `instance.start` unless they say otherwise.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX].operations","typeLabel":"OperationsBlock · object | null"}},"additionalProperties":false,"type":"object","required":["name"],"title":"ComponentVariant","description":"One of a component's bodies; an instance picks it by name.","uniqueKey":"components.items.[INDEX].variants.oneOf.0.items.[INDEX]","typeLabel":"ComponentVariant · object"},"title":"Variants","description":"Named bodies, the first the default. Give this or `children`.","minItems":1,"uniqueKey":"components.items.[INDEX].variants.oneOf.0","typeLabel":"ComponentVariant · object[]"},{"type":"null","title":"Variants","description":"Named bodies, the first the default. Give this or `children`.","uniqueKey":"components.items.[INDEX].variants.oneOf.1","typeLabel":"null"}],"uniqueKey":"components.items.[INDEX].variants","typeLabel":"ComponentVariant · object[] | null"}},"additionalProperties":false,"type":"object","required":["id","width","height"],"title":"Component","description":"A component definition (render-node AEC §5g): a precomp kept in the request, with a\nfixed box, typed properties bound to its body, variants and slots. `instance` elements\nplace it.","uniqueKey":"components.items.[INDEX]","typeLabel":"Component · object"},"type":"array","title":"Components","description":"Component definitions, which `instance` elements place. Schema of one: `blocks.components` in GET /v1/capabilities.","uniqueKey":"components","typeLabel":"Component · object[]"},"motion_blur":{"oneOf":[{"type":"object","title":"MotionBlur","description":"Shutter-based motion blur over the whole composition (§5c). Graphics motion smears; video holds its decoded frame within the shutter (as in AE). Opt-in and costly: accumulation is CPU-side, so the render falls back to software encoding — expect roughly `samples`× render time.","required":["samples"],"properties":{"samples":{"type":"integer","maximum":32,"minimum":2,"title":"Samples","description":"Temporal samples per frame (2–32).","isRequired":true,"uniqueKey":"motion_blur.oneOf.0.samples","typeLabel":"integer"},"shutter":{"type":"number","maximum":1,"exclusiveMinimum":0,"title":"Shutter","description":"Shutter fraction of the frame interval, (0–1]. (Exactly 0 is rejected: it renders N identical samples — full cost, zero blur.)","default":0.5,"uniqueKey":"motion_blur.oneOf.0.shutter","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"motion_blur.oneOf.0","typeLabel":"MotionBlur · object"},{"type":"null","description":"Shutter-based motion blur over the whole composition (§5c). Graphics motion smears; video holds its decoded frame within the shutter (as in AE). Opt-in and costly: accumulation is CPU-side, so the render falls back to software encoding — expect roughly `samples`× render time.","uniqueKey":"motion_blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"motion_blur","typeLabel":"MotionBlur · object | null"},"background_gradient":{"oneOf":[{"type":"string","description":"Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS `linear-gradient(...)` string.","pattern":"^\\s*(?:linear|radial)-gradient\\s*\\(","example":"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)","uniqueKey":"background_gradient.oneOf.0","typeLabel":"string"},{"type":"object","title":"Gradient","description":"Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS `linear-gradient(...)` string.","required":["stops"],"properties":{"stops":{"items":{"properties":{"offset":{"type":"number","maximum":1,"minimum":0,"title":"Offset","description":"Position along the gradient, 0–1.","isRequired":true,"uniqueKey":"background_gradient.oneOf.1.stops.items.[INDEX].offset","typeLabel":"number"},"color":{"type":"string","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","title":"Color","description":"Stop colour (hex, alpha supported).","example":"#e07a4f","isRequired":true,"uniqueKey":"background_gradient.oneOf.1.stops.items.[INDEX].color","typeLabel":"string"}},"additionalProperties":false,"type":"object","required":["offset","color"],"title":"GradientStop","uniqueKey":"background_gradient.oneOf.1.stops.items.[INDEX]","typeLabel":"GradientStop · object"},"type":"array","minItems":2,"title":"Stops","description":"Two or more colour stops.","isRequired":true,"uniqueKey":"background_gradient.oneOf.1.stops","typeLabel":"GradientStop · object[]"},"kind":{"type":"string","enum":["linear","radial","conic"],"title":"Kind","description":"`conic` sweeps the stops clockwise once round `center`, starting at `angle_degrees`.","default":"linear","uniqueKey":"background_gradient.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"angle_degrees":{"type":"number","title":"Angle Degrees","description":"Linear gradient angle in degrees, measured clockwise on the screen (y down): 0 = left→right (offset 0 at the left), 90 = top→bottom, 45 = top-left→bottom-right, 315 = bottom-left→top-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact. On a conic gradient: where the sweep starts, degrees clockwise from 3 o'clock.","default":0,"uniqueKey":"background_gradient.oneOf.1.angle_degrees","typeLabel":"number"},"center":{"oneOf":[{"type":"object","title":"Point","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"background_gradient.oneOf.1.center.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"background_gradient.oneOf.1.center.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"background_gradient.oneOf.1.center.oneOf.0","typeLabel":"Point · object"},{"type":"null","description":"Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs down the screen, as CSS `at` does: `{x: 0.5, y: 0}` is the top edge and `{x: 0.5, y: 1}` the bottom (CSS `at 50% 100%`). Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box. A conic gradient sweeps round this point.","uniqueKey":"background_gradient.oneOf.1.center.oneOf.1","typeLabel":"null"}],"uniqueKey":"background_gradient.oneOf.1.center","typeLabel":"Point · object | null"}},"additionalProperties":false,"uniqueKey":"background_gradient.oneOf.1","typeLabel":"Gradient · object"},{"type":"null","description":"Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS `linear-gradient(...)` string.","uniqueKey":"background_gradient.oneOf.2","typeLabel":"null"}],"uniqueKey":"background_gradient","typeLabel":"string | Gradient · object | null"},"watermark_url":{"oneOf":[{"type":"string","title":"Watermark Url","description":"Watermark image overlaid on the output (§6).","format":"uri","maxLength":2083,"minLength":1,"uniqueKey":"watermark_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Watermark Url","description":"Watermark image overlaid on the output (§6).","uniqueKey":"watermark_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"watermark_url","typeLabel":"string\u003curi> | null"},"custom_animations":{"oneOf":[{"type":"object","title":"CustomAnimationRegistry","description":"Inline custom-animation definitions (§3), registered with the engine before any element is built. Reference an `element` entry by name via `motion[].custom` on any video/image/shape element or group; reference a `text` entry via a text element's `animation_preset` or `motion[].custom`. The catalog stops being a ceiling — anything expressible as keyframes is expressible in the request.","properties":{"element":{"items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Reference name (reserved/catalog-shadowing names are rejected).","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].name","typeLabel":"string"},"keyframes":{"items":{"properties":{"time":{"type":"number","maximum":1,"minimum":0,"title":"Time","description":"Fraction of the animation (0–1).","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].time","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing into this keyframe — any `easings` catalog name (`quad_out`, `expo_in_out`, `hold`, …). Unknown names are rejected. A `bezier`/`spring`/`back`/`elastic` sub-object overrides it.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing into this keyframe — any `easings` catalog name (`quad_out`, `expo_in_out`, `hold`, …). Unknown names are rejected. A `bezier`/`spring`/`back`/`elastic` sub-object overrides it.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].easing","typeLabel":"string | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"translate":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].translate","typeLabel":"Point · object | null"},"path":{"oneOf":[{"type":"object","title":"SpatialPath","description":"Curve the translate into this keyframe along a cubic bezier (`c1`/`c2` control points).","required":["c1","c2"],"properties":{"c1":{"properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1.y","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"Point","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1","typeLabel":"Point · object"},"c2":{"properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2.y","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"Point","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2","typeLabel":"Point · object"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0","typeLabel":"SpatialPath · object"},{"type":"null","description":"Curve the translate into this keyframe along a cubic bezier (`c1`/`c2` control points).","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].path","typeLabel":"SpatialPath · object | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale factor, or `{x, y}` for non-uniform scale.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"object","title":"ScaleXY","description":"Non-uniform scale for a custom-animation keyframe.","properties":{"x":{"type":"number","title":"X","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1","typeLabel":"ScaleXY · object"},{"type":"null","title":"Scale","description":"Uniform scale factor, or `{x, y}` for non-uniform scale.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.2","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].scale","typeLabel":"number | ScaleXY · object | null"},"rotate":{"oneOf":[{"type":"number","title":"Rotate","description":"In-plane (z) rotation, degrees.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotate.oneOf.0","typeLabel":"number"},{"type":"null","title":"Rotate","description":"In-plane (z) rotation, degrees.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotate.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotate","typeLabel":"number | null"},"rotation":{"oneOf":[{"type":"object","title":"RotationXYZ","description":"Full 3D rotation `{x, y, z}` (degrees); overrides `rotate`. Non-zero x/y = animated perspective tilt.","properties":{"x":{"type":"number","title":"X","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.y","typeLabel":"number"},"z":{"type":"number","title":"Z","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.z","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0","typeLabel":"RotationXYZ · object"},{"type":"null","description":"Full 3D rotation `{x, y, z}` (degrees); overrides `rotate`. Non-zero x/y = animated perspective tilt.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].rotation","typeLabel":"RotationXYZ · object | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].opacity","typeLabel":"number | null"},"color":{"oneOf":[{"type":"string","title":"Color","description":"Colour tint at this keyframe (multiplied with the element). An 8-digit hex alpha composes with `opacity` — when both are set, `opacity` wins for the alpha channel.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","description":"Colour tint at this keyframe (multiplied with the element). An 8-digit hex alpha composes with `opacity` — when both are set, `opacity` wins for the alpha channel.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].color.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].color","typeLabel":"string | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"Per-glyph blur amount (fraction of the em). Text registries only.","minimum":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"Per-glyph blur amount (fraction of the em). Text registries only.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX].blur","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"AnimationKeyframe","description":"A keyframe in a custom animation definition (§3). Time is 0–1 of the animation.\n\nProperty channels mirror the engine's catalog file format, so anything a\nshipped preset expresses is expressible here: position (`translate`, curved\nvia `path`), uniform or per-axis `scale`, scalar z `rotate` or full 3D\n`rotation`, `opacity`/`color` tint, per-glyph `blur` (text registries only),\nand the full easing vocabulary including the parameterized families\n(`bezier` / `spring` / `back` / `elastic`).","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes.items.[INDEX]","typeLabel":"AnimationKeyframe · object"},"type":"array","minItems":1,"title":"Keyframes","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].keyframes","typeLabel":"AnimationKeyframe · object[]"},"group":{"type":"string","enum":["block","word","glyph"],"title":"Group","description":"What the animation repeats over: the whole text block, each word, or each glyph. Required for `selector` to shape anything — a selector over a single block has nothing to range across. Text registries only.","default":"block","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].group","typeLabel":"enum\u003cstring>"},"selector":{"oneOf":[{"type":"object","title":"RangeSelector","description":"AE-style range selector: shape this animation's amount by position along the text (§4, W2). Set `group` to `word` or `glyph` alongside it. Text registries only.","properties":{"based_on":{"type":"string","enum":["glyph","word"],"title":"Based On","default":"glyph","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.based_on","typeLabel":"enum\u003cstring>"},"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Range start, fraction along the text.","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Range end, fraction along the text.","default":1,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.end","typeLabel":"number"},"falloff":{"type":"number","minimum":0,"title":"Falloff","description":"Ease to zero over this fraction beyond each edge.","default":0,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.falloff","typeLabel":"number"},"ease":{"oneOf":[{"type":"string","title":"Ease","description":"Easing curve name for the falloff.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.ease.oneOf.0","typeLabel":"string"},{"type":"null","title":"Ease","description":"Easing curve name for the falloff.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.ease.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.ease","typeLabel":"string | null"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.0","typeLabel":"RangeSelector · object"},{"type":"null","description":"AE-style range selector: shape this animation's amount by position along the text (§4, W2). Set `group` to `word` or `glyph` alongside it. Text registries only.","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX].selector","typeLabel":"RangeSelector · object | null"}},"additionalProperties":false,"type":"object","required":["name","keyframes"],"title":"CustomAnimation","description":"A task-supplied keyframe animation, referenced by `name` from an animation entry (§3).","uniqueKey":"custom_animations.oneOf.0.element.items.[INDEX]","typeLabel":"CustomAnimation · object"},"type":"array","title":"Element","default":[],"uniqueKey":"custom_animations.oneOf.0.element","typeLabel":"CustomAnimation · object[]"},"text":{"items":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Reference name (reserved/catalog-shadowing names are rejected).","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].name","typeLabel":"string"},"keyframes":{"items":{"properties":{"time":{"type":"number","maximum":1,"minimum":0,"title":"Time","description":"Fraction of the animation (0–1).","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].time","typeLabel":"number"},"easing":{"oneOf":[{"type":"string","title":"Easing","description":"Easing into this keyframe — any `easings` catalog name (`quad_out`, `expo_in_out`, `hold`, …). Unknown names are rejected. A `bezier`/`spring`/`back`/`elastic` sub-object overrides it.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].easing.oneOf.0","typeLabel":"string"},{"type":"null","title":"Easing","description":"Easing into this keyframe — any `easings` catalog name (`quad_out`, `expo_in_out`, `hold`, …). Unknown names are rejected. A `bezier`/`spring`/`back`/`elastic` sub-object overrides it.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].easing.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].easing","typeLabel":"string | null"},"bezier":{"oneOf":[{"type":"object","title":"BezierEasing","description":"CSS cubic-bezier(x1, y1, x2, y2) timing curve.","properties":{"x1":{"type":"number","title":"X1","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.x1","typeLabel":"number"},"y1":{"type":"number","title":"Y1","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.y1","typeLabel":"number"},"x2":{"type":"number","title":"X2","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.x2","typeLabel":"number"},"y2":{"type":"number","title":"Y2","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0.y2","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.0","typeLabel":"BezierEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].bezier","typeLabel":"BezierEasing · object | null"},"spring":{"oneOf":[{"type":"object","title":"SpringEasing","description":"Damped-spring ease over the keyframe segment.\n\nOnly the damping ratio zeta = damping / (2 * sqrt(stiffness * mass)) shapes the\ncurve; the segment's duration sets its timing. Below 1 the spring overshoots and\nrings (the defaults give zeta = 0.5); at 1 or above it settles without overshoot.\nAn underdamped spring runs until its envelope decays to 0.1% (settle x w0 =\nln(1000) / zeta, w0 = sqrt(stiffness / mass)). Since render-node's overdamped settle\nfix (GVR M3), a spring at zeta >= 1 runs over its slowest decay rate instead; before\nit, an overdamped spring's window was cut short and it reached the target still\nmoving.","properties":{"stiffness":{"type":"number","exclusiveMinimum":0,"title":"Stiffness","description":"Stiffness; higher lowers zeta, so the spring rings more.","default":100,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.stiffness","typeLabel":"number"},"damping":{"type":"number","exclusiveMinimum":0,"title":"Damping","description":"Damping; higher raises zeta (less overshoot), lower rings longer.","default":10,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.damping","typeLabel":"number"},"mass":{"type":"number","exclusiveMinimum":0,"title":"Mass","description":"Mass; like stiffness, higher lowers zeta, so the spring rings more. It does not swing slower: the segment's duration sets the timing.","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0.mass","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.0","typeLabel":"SpringEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].spring","typeLabel":"SpringEasing · object | null"},"back":{"oneOf":[{"type":"object","title":"BackEasing","description":"Anticipate/overshoot ease (AE 'back').","properties":{"overshoot":{"type":"number","title":"Overshoot","description":"Overshoot amount; AE default 1.70158.","default":1.70158,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0.overshoot","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' anticipates, 'out' overshoots.","default":"out","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].back.oneOf.0","typeLabel":"BackEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].back.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].back","typeLabel":"BackEasing · object | null"},"elastic":{"oneOf":[{"type":"object","title":"ElasticEasing","description":"Elastic ring-out/ring-in ease.","properties":{"amplitude":{"type":"number","title":"Amplitude","description":"Ring amplitude.","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.amplitude","typeLabel":"number"},"period":{"type":"number","exclusiveMinimum":0,"title":"Period","description":"Ring period as a fraction of the segment.","default":0.3,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.period","typeLabel":"number"},"dir":{"type":"string","enum":["in","out"],"title":"Dir","description":"'in' rings before, 'out' after.","default":"out","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0.dir","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.0","typeLabel":"ElasticEasing · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].elastic","typeLabel":"ElasticEasing · object | null"},"translate":{"oneOf":[{"type":"object","title":"Point","properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.0","typeLabel":"Point · object"},{"type":"null","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].translate.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].translate","typeLabel":"Point · object | null"},"path":{"oneOf":[{"type":"object","title":"SpatialPath","description":"Curve the translate into this keyframe along a cubic bezier (`c1`/`c2` control points).","required":["c1","c2"],"properties":{"c1":{"properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1.y","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"Point","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c1","typeLabel":"Point · object"},"c2":{"properties":{"x":{"type":"number","title":"X","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0.5,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2.y","typeLabel":"number"}},"additionalProperties":false,"type":"object","title":"Point","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0.c2","typeLabel":"Point · object"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.0","typeLabel":"SpatialPath · object"},{"type":"null","description":"Curve the translate into this keyframe along a cubic bezier (`c1`/`c2` control points).","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].path","typeLabel":"SpatialPath · object | null"},"scale":{"oneOf":[{"type":"number","title":"Scale","description":"Uniform scale factor, or `{x, y}` for non-uniform scale.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.0","typeLabel":"number"},{"type":"object","title":"ScaleXY","description":"Non-uniform scale for a custom-animation keyframe.","properties":{"x":{"type":"number","title":"X","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1.y","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.1","typeLabel":"ScaleXY · object"},{"type":"null","title":"Scale","description":"Uniform scale factor, or `{x, y}` for non-uniform scale.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale.oneOf.2","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].scale","typeLabel":"number | ScaleXY · object | null"},"rotate":{"oneOf":[{"type":"number","title":"Rotate","description":"In-plane (z) rotation, degrees.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotate.oneOf.0","typeLabel":"number"},{"type":"null","title":"Rotate","description":"In-plane (z) rotation, degrees.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotate.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotate","typeLabel":"number | null"},"rotation":{"oneOf":[{"type":"object","title":"RotationXYZ","description":"Full 3D rotation `{x, y, z}` (degrees); overrides `rotate`. Non-zero x/y = animated perspective tilt.","properties":{"x":{"type":"number","title":"X","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.x","typeLabel":"number"},"y":{"type":"number","title":"Y","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.y","typeLabel":"number"},"z":{"type":"number","title":"Z","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0.z","typeLabel":"number"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.0","typeLabel":"RotationXYZ · object"},{"type":"null","description":"Full 3D rotation `{x, y, z}` (degrees); overrides `rotate`. Non-zero x/y = animated perspective tilt.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].rotation","typeLabel":"RotationXYZ · object | null"},"opacity":{"oneOf":[{"type":"number","title":"Opacity","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].opacity.oneOf.0","typeLabel":"number"},{"type":"null","title":"Opacity","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].opacity.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].opacity","typeLabel":"number | null"},"color":{"oneOf":[{"type":"string","title":"Color","description":"Colour tint at this keyframe (multiplied with the element). An 8-digit hex alpha composes with `opacity` — when both are set, `opacity` wins for the alpha channel.","pattern":"^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].color.oneOf.0","typeLabel":"string"},{"type":"null","title":"Color","description":"Colour tint at this keyframe (multiplied with the element). An 8-digit hex alpha composes with `opacity` — when both are set, `opacity` wins for the alpha channel.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].color.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].color","typeLabel":"string | null"},"blur":{"oneOf":[{"type":"number","title":"Blur","description":"Per-glyph blur amount (fraction of the em). Text registries only.","minimum":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].blur.oneOf.0","typeLabel":"number"},{"type":"null","title":"Blur","description":"Per-glyph blur amount (fraction of the em). Text registries only.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].blur.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX].blur","typeLabel":"number | null"}},"additionalProperties":false,"type":"object","required":["time"],"title":"AnimationKeyframe","description":"A keyframe in a custom animation definition (§3). Time is 0–1 of the animation.\n\nProperty channels mirror the engine's catalog file format, so anything a\nshipped preset expresses is expressible here: position (`translate`, curved\nvia `path`), uniform or per-axis `scale`, scalar z `rotate` or full 3D\n`rotation`, `opacity`/`color` tint, per-glyph `blur` (text registries only),\nand the full easing vocabulary including the parameterized families\n(`bezier` / `spring` / `back` / `elastic`).","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes.items.[INDEX]","typeLabel":"AnimationKeyframe · object"},"type":"array","minItems":1,"title":"Keyframes","isRequired":true,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].keyframes","typeLabel":"AnimationKeyframe · object[]"},"group":{"type":"string","enum":["block","word","glyph"],"title":"Group","description":"What the animation repeats over: the whole text block, each word, or each glyph. Required for `selector` to shape anything — a selector over a single block has nothing to range across. Text registries only.","default":"block","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].group","typeLabel":"enum\u003cstring>"},"selector":{"oneOf":[{"type":"object","title":"RangeSelector","description":"AE-style range selector: shape this animation's amount by position along the text (§4, W2). Set `group` to `word` or `glyph` alongside it. Text registries only.","properties":{"based_on":{"type":"string","enum":["glyph","word"],"title":"Based On","default":"glyph","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.based_on","typeLabel":"enum\u003cstring>"},"start":{"type":"number","maximum":1,"minimum":0,"title":"Start","description":"Range start, fraction along the text.","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.start","typeLabel":"number"},"end":{"type":"number","maximum":1,"minimum":0,"title":"End","description":"Range end, fraction along the text.","default":1,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.end","typeLabel":"number"},"falloff":{"type":"number","minimum":0,"title":"Falloff","description":"Ease to zero over this fraction beyond each edge.","default":0,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.falloff","typeLabel":"number"},"ease":{"oneOf":[{"type":"string","title":"Ease","description":"Easing curve name for the falloff.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.ease.oneOf.0","typeLabel":"string"},{"type":"null","title":"Ease","description":"Easing curve name for the falloff.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.ease.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.ease","typeLabel":"string | null"},"invert":{"type":"boolean","title":"Invert","default":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0.invert","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.0","typeLabel":"RangeSelector · object"},{"type":"null","description":"AE-style range selector: shape this animation's amount by position along the text (§4, W2). Set `group` to `word` or `glyph` alongside it. Text registries only.","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX].selector","typeLabel":"RangeSelector · object | null"}},"additionalProperties":false,"type":"object","required":["name","keyframes"],"title":"CustomAnimation","description":"A task-supplied keyframe animation, referenced by `name` from an animation entry (§3).","uniqueKey":"custom_animations.oneOf.0.text.items.[INDEX]","typeLabel":"CustomAnimation · object"},"type":"array","title":"Text","default":[],"uniqueKey":"custom_animations.oneOf.0.text","typeLabel":"CustomAnimation · object[]"}},"additionalProperties":false,"uniqueKey":"custom_animations.oneOf.0","typeLabel":"CustomAnimationRegistry · object"},{"type":"null","description":"Inline custom-animation definitions (§3), registered with the engine before any element is built. Reference an `element` entry by name via `motion[].custom` on any video/image/shape element or group; reference a `text` entry via a text element's `animation_preset` or `motion[].custom`. The catalog stops being a ceiling — anything expressible as keyframes is expressible in the request.","uniqueKey":"custom_animations.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_animations","typeLabel":"CustomAnimationRegistry · object | null"},"metadata":{"additionalProperties":{"type":"string","uniqueKey":"metadata.additionalProperties","typeLabel":"string"},"type":"object","title":"Metadata","description":"Arbitrary key-value pairs echoed back in all webhook payloads.","example":{"project_id":"proj_123"},"uniqueKey":"metadata","typeLabel":"Metadata · object"},"webhook_url":{"oneOf":[{"type":"string","title":"Webhook Url","description":"Per-request webhook URL. Overrides workspace-level webhooks for this job only. Receives `render.completed`, `render.failed`, and progress events.","format":"uri","maxLength":2083,"minLength":1,"example":"https://app.example.com/hooks/framelane","uniqueKey":"webhook_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","title":"Webhook Url","description":"Per-request webhook URL. Overrides workspace-level webhooks for this job only. Receives `render.completed`, `render.failed`, and progress events.","example":"https://app.example.com/hooks/framelane","uniqueKey":"webhook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"webhook_url","typeLabel":"string\u003curi> | null"},"ingest_external":{"oneOf":[{"type":"boolean","title":"Ingest External","description":"Controls handling of video/audio source URLs that are not hosted by Framelane. When `true` (the default), each such file is probed for its duration before rendering: the job starts in the `ingesting` state and moves to `queued` once the probe answers, so elements may omit `out_point`. The file itself is fetched by the renderer at render time, so the URL must be a direct, public https link to the media (not a share page) that supports range requests. When `false`, the URL is passed straight through and video/audio require an explicit `out_point`.","example":true,"uniqueKey":"ingest_external.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Ingest External","description":"Controls handling of video/audio source URLs that are not hosted by Framelane. When `true` (the default), each such file is probed for its duration before rendering: the job starts in the `ingesting` state and moves to `queued` once the probe answers, so elements may omit `out_point`. The file itself is fetched by the renderer at render time, so the URL must be a direct, public https link to the media (not a share page) that supports range requests. When `false`, the URL is passed straight through and video/audio require an explicit `out_point`.","example":true,"uniqueKey":"ingest_external.oneOf.1","typeLabel":"null"}],"uniqueKey":"ingest_external","typeLabel":"boolean | null"}},"additionalProperties":false,"type":"object","title":"RenderRequest","description":"Body for ``POST /v1/renders``.\n\nDefines the composition to render: dimensions, output format, timeline elements,\nand optional transitions. The render engine produces a single video artifact.","uniqueKey":"","typeLabel":"RenderRequest · object"},"examples":{"Example":{"title":"Example","value":{"version":"v5","schema_version":"v5","width":1920,"height":1080,"duration":15,"frame_rate":30,"output_format":"mp4","output_filename":"my-render","background_color":"#000000ff","background_image_url":"https://cdn.example.com/bg.jpg","alpha":false,"elements":[{"source_url":"https://cdn.example.com/clip.mp4","lut_url":"\u003cstring>","lut_intensity":100,"brightness":0,"contrast":0,"saturation":0,"exposure":0,"sharpness":0,"blur":0,"noise":0,"vignette":0,"hue_rotate":0,"temperature":0,"tint":0,"vibrance":0,"highlights":0,"shadows":0,"crop_top":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"border_radius":0,"border_color":"\u003cstring>","border_width":0,"shadow_color":"\u003cstring>","shadow_blur":0,"shadow_x":0,"shadow_y":0,"blend_mode":"none","mask":{"feather":0,"scale":1,"center":{"x":0.5,"y":0.5}},"mask_keyframes":[{"time":1,"feather":123,"scale":123,"center":{"x":0.5,"y":0.5},"easing":"\u003cstring>","spring":{"stiffness":100,"damping":10,"mass":1},"back":{"overshoot":1.70158,"dir":"out"},"elastic":{"amplitude":1,"period":0.3,"dir":"out"},"bezier":{"x1":0,"y1":0,"x2":1,"y2":1}}],"matte":{"source":"\u003cstring>","mode":"alpha","invert":false},"backdrop_blur":0,"backdrop_blur_keyframes":[{"time":1,"value":64}],"layer_blur":0,"layer_blur_keyframes":[{"time":1,"value":64}],"glass":{"bevel":128,"refraction":0.5,"dispersion":0.5},"x":"50%","y":"50%","width":"40%","height":"80%","aspect_ratio":123,"x_anchor":"0%","y_anchor":"100%","x_rotation":"0°","y_rotation":"0°","z_rotation":"0°","x_scale":"100%","y_scale":"100%","flip_horizontal":false,"flip_vertical":false,"opacity":100,"z_index":123,"clip":false,"color_overlay":"\u003cstring>","type":"video","id":"clip_01","name":"\u003cstring>","track":127,"time":0,"visible":true,"locked":false,"in_point":0,"out_point":6,"speed":1,"playback_rate_keyframes":[{"time":1,"rate":1}],"volume":100,"muted":false,"loop":false,"fade_in_duration":0,"fade_out_duration":0,"effects":[],"motion":[]}],"transitions":[{"type":"cross_dissolve","duration":0.5,"from_id":"video_01","to_id":"video_02","z_index":1}],"groups":[{"id":"hero","parent":"\u003cstring>","pivot":{"x":0.5,"y":0.5},"translate":{"x":0.5,"y":0.5},"scale":1,"rotation_degrees":0,"x_rotation":"0°","y_rotation":"0°","opacity":1,"members":["\u003cstring>"],"animations":[{"time":1,"duration":123,"preset":"\u003cstring>","custom":"\u003cstring>","easing":"ease_in_out","reversed":false,"scope":"element","delay":0,"spacing":1,"loop":false,"audio":{"feature":"amplitude","scale":0,"opacity":0,"translate":{"x":0.5,"y":0.5},"rotate":0}}],"layout":{"type":"stack","direction":"row","gap":0,"align":"center","origin":{"x":0.5,"y":0.5}}}],"design_size":{"width":1920,"height":1080},"operations":{"markers":[],"groups":[]},"components":[{"id":"card","width":552,"height":400,"clip":true,"corner_radius":1,"properties":[],"children":[{"source_url":"https://cdn.example.com/clip.mp4","lut_url":"\u003cstring>","lut_intensity":100,"brightness":0,"contrast":0,"saturation":0,"exposure":0,"sharpness":0,"blur":0,"noise":0,"vignette":0,"hue_rotate":0,"temperature":0,"tint":0,"vibrance":0,"highlights":0,"shadows":0,"crop_top":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"border_radius":0,"border_color":"\u003cstring>","border_width":0,"shadow_color":"\u003cstring>","shadow_blur":0,"shadow_x":0,"shadow_y":0,"blend_mode":"none","mask":{"feather":0,"scale":1,"center":{"x":0.5,"y":0.5}},"mask_keyframes":[{"time":1,"feather":123,"scale":123,"center":{"x":0.5,"y":0.5},"easing":"\u003cstring>","spring":{"stiffness":100,"damping":10,"mass":1},"back":{"overshoot":1.70158,"dir":"out"},"elastic":{"amplitude":1,"period":0.3,"dir":"out"},"bezier":{"x1":0,"y1":0,"x2":1,"y2":1}}],"matte":{"source":"\u003cstring>","mode":"alpha","invert":false},"backdrop_blur":0,"backdrop_blur_keyframes":[{"time":1,"value":64}],"layer_blur":0,"layer_blur_keyframes":[{"time":1,"value":64}],"glass":{"bevel":128,"refraction":0.5,"dispersion":0.5},"x":123,"y":123,"width":1,"height":1,"aspect_ratio":123,"x_anchor":"50%","y_anchor":"50%","x_rotation":"0°","y_rotation":"0°","z_rotation":"0°","x_scale":"100%","y_scale":"100%","flip_horizontal":false,"flip_vertical":false,"opacity":100,"z_index":123,"clip":false,"color_overlay":"\u003cstring>","type":"video","id":"clip_01","name":"\u003cstring>","track":127,"time":1,"visible":true,"locked":false,"in_point":0,"out_point":6,"speed":1,"playback_rate_keyframes":[{"time":1,"rate":1}],"volume":100,"muted":false,"loop":false,"fade_in_duration":0,"fade_out_duration":0,"effects":[],"motion":[]}],"operations":{"markers":[],"groups":[]},"variants":[{"name":"compact","width":1,"height":1,"children":[],"operations":{"markers":[],"groups":[]}}]}],"motion_blur":{"samples":17,"shutter":0.5},"background_gradient":"linear-gradient(90deg, #ff0000 0%, #0000ff 100%)","watermark_url":"\u003cstring>","custom_animations":{"element":[],"text":[]},"metadata":{"project_id":"proj_123"},"webhook_url":"https://app.example.com/hooks/framelane","ingest_external":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"9641a20c-d860-487e-b5a5-e294af2899bc":{"description":"Idempotent replay — same Idempotency-Key reused.","content":{"application/json":{"schema":{"properties":{"id":{"type":"string","title":"Id","description":"Unique job ID. Prefix indicates type: `render_` or `task_`.","example":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"kind":{"type":"string","enum":["render","task"],"title":"JobKind","description":"Whether this is a `render` or a `task`.","example":"render","isRequired":true,"uniqueKey":"kind","typeLabel":"enum\u003cstring>"},"workspace_id":{"type":"string","title":"Workspace Id","description":"ID of the workspace that owns this job.","example":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","isRequired":true,"uniqueKey":"workspace_id","typeLabel":"string"},"status":{"type":"string","enum":["ingesting","queued","processing","completed","failed","cancelled"],"title":"JobStatus","description":"Current lifecycle state: `queued` → `processing` → `completed` / `failed` / `cancelled`.","x-enumDescriptions":{"ingesting":"External source files are being probed for duration before the render is queued.","queued":"Accepted and waiting for a worker to pick it up.","processing":"Actively rendering or processing.","completed":"Finished successfully; the output artifact is available.","failed":"Terminated with an error (see `error`).","cancelled":"Cancelled by the caller before completion."},"example":"queued","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO-8601 UTC timestamp when the job was created.","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO-8601 UTC timestamp of the last status change.","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"ok":{"type":"boolean","title":"Ok","description":"Advisory — the render was still accepted and dispatched. False means the composition has error-severity findings that will likely make the output wrong (a self-transition, a fully off-canvas element); it does NOT mean the submission was refused. Everything that actually blocks a render is a 422 before you ever see this field.","example":true,"isRequired":true,"uniqueKey":"ok","typeLabel":"boolean"},"is_preview":{"type":"boolean","title":"Is Preview","description":"True for a cheap preview render. Previews are not billed and are excluded from the renders list.","default":false,"example":false,"uniqueKey":"is_preview","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"editor_url","typeLabel":"string | null"},"task_type":{"oneOf":[{"type":"string","title":"TaskType","description":"For `task` jobs only — the specific AI operation.","enum":["transcribe"],"x-enumDescriptions":{"transcribe":"Speech-to-text transcription (via AssemblyAI) with optional analysis. Returns the transcript inline on the task's `result` object — there is no file artifact, so `output` is null and `/v1/tasks/{id}/download` returns 404."},"example":"transcribe","uniqueKey":"task_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"For `task` jobs only — the specific AI operation.","example":"transcribe","uniqueKey":"task_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"task_type","typeLabel":"enum\u003cstring> | null"},"progress_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Progress Percent","description":"0–100 progress indicator updated by the render engine.","default":0,"example":0,"uniqueKey":"progress_percent","typeLabel":"integer"},"progress_stage":{"oneOf":[{"type":"string","title":"ProgressStage","description":"Current processing phase within a job.","enum":["downloading","compositing","encoding","uploading"],"x-enumDescriptions":{"downloading":"Fetching source media.","compositing":"Compositing the scene on the GPU.","encoding":"Encoding the output video.","uploading":"Uploading the finished artifact to storage."},"example":"compositing","uniqueKey":"progress_stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Current processing phase within a job.","example":"compositing","uniqueKey":"progress_stage.oneOf.1","typeLabel":"null"}],"uniqueKey":"progress_stage","typeLabel":"enum\u003cstring> | null"},"output":{"oneOf":[{"type":"object","title":"JobOutput","description":"Populated once `status == completed`. Contains the signed artifact URL.","properties":{"url":{"oneOf":[{"type":"string","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"output.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"output.oneOf.0.url.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.url","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"output.oneOf.0.width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"output.oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"output.oneOf.0.height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"output.oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.height","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"output.oneOf.0.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"output.oneOf.0.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.duration","typeLabel":"number | null"},"size_bytes":{"oneOf":[{"type":"integer","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"output.oneOf.0.size_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"output.oneOf.0.size_bytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.size_bytes","typeLabel":"integer | null"}},"uniqueKey":"output.oneOf.0","typeLabel":"JobOutput · object"},{"type":"null","description":"Populated once `status == completed`. Contains the signed artifact URL.","uniqueKey":"output.oneOf.1","typeLabel":"null"}],"uniqueKey":"output","typeLabel":"JobOutput · object | null"},"result":{"oneOf":[{"type":"object","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"additionalProperties":true,"uniqueKey":"result.oneOf.0","typeLabel":"Result · object"},{"type":"null","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"uniqueKey":"result.oneOf.1","typeLabel":"null"}],"uniqueKey":"result","typeLabel":"Result · object | null"},"error":{"oneOf":[{"type":"object","title":"JobError","description":"Populated when `status == failed`. Contains a structured error code.","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_source","source_not_found","source_too_large","asset_not_ready","codec_unsupported","decode_failed","encode_failed","timeout","out_of_memory","gpu_error","upload_failed","provider_error","ingest_failed","render_refused","internal","cancelled"],"title":"ErrorCode","description":"Machine-readable error code.","x-enumDescriptions":{"invalid_source":"A source URL was malformed or inaccessible.","source_not_found":"A source URL returned 404.","source_too_large":"A source file exceeded the maximum allowed size.","asset_not_ready":"A referenced asset was still ingesting when the job ran.","codec_unsupported":"A source used a codec the renderer cannot decode.","decode_failed":"A source file could not be decoded.","encode_failed":"The output could not be encoded.","timeout":"Processing exceeded the time limit.","out_of_memory":"The renderer ran out of GPU memory.","gpu_error":"A GPU hardware/driver error occurred.","upload_failed":"The output artifact failed to upload to storage.","provider_error":"An upstream provider (e.g. AssemblyAI) returned an error.","ingest_failed":"An external source could not be probed (unreachable, not a media file, or timed out).","render_refused":"The renderer refused the composition by name: a runtime shader that did not compile or ran over its GPU time budget, or an operation, a component or a nested composition it could not apply. `error_message` carries the engine's words; change what it names and submit again.","internal":"An unexpected internal error occurred.","cancelled":"The job was cancelled."},"example":"invalid_source","isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","description":"Human-readable error description.","example":"Source URL returned 404.","isRequired":true,"uniqueKey":"error.oneOf.0.message","typeLabel":"string"}},"uniqueKey":"error.oneOf.0","typeLabel":"JobError · object"},{"type":"null","description":"Populated when `status == failed`. Contains a structured error code.","uniqueKey":"error.oneOf.1","typeLabel":"null"}],"uniqueKey":"error","typeLabel":"JobError · object | null"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Caller-supplied key-value pairs echoed back on every webhook and response.","example":{"project_id":"proj_123","user_ref":"usr_abc"},"uniqueKey":"metadata","typeLabel":"Metadata · object"},"completed_at":{"oneOf":[{"type":"string","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","format":"date-time","uniqueKey":"completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"completed_at","typeLabel":"string\u003cdate-time> | null"},"violations":{"items":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. 'DANGLING_TRANSITION'.","isRequired":true,"uniqueKey":"violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"violations.items.[INDEX].message","typeLabel":"string"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity","description":"'error' blocks a good render; 'warning' is advisory.","default":"error","uniqueKey":"violations.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"path":{"oneOf":[{"type":"string","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].path","typeLabel":"string | null"},"pointer":{"oneOf":[{"type":"string","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].pointer","typeLabel":"string | null"},"target_id":{"oneOf":[{"type":"string","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].target_id","typeLabel":"string | null"},"bbox":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].bbox","typeLabel":"number[] | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].time","typeLabel":"number | null"}},"type":"object","required":["code","message"],"title":"Violation","uniqueKey":"violations.items.[INDEX]","typeLabel":"Violation · object"},"type":"array","title":"Violations","description":"Advisory — the render was still accepted and dispatched. Cross-element and layout findings from the same linter the preview dry-run runs, attached so you can see problems on the render you just paid for instead of only in the artifact. To catch these BEFORE spending a render, call POST /v1/preview with dry_run.Truncated to the first 36 findings (errors first) on very large compositions, with a VIOLATIONS_TRUNCATED marker carrying the full count; the free dry run is never truncated.","uniqueKey":"violations","typeLabel":"Violation · object[]"}},"type":"object","required":["id","kind","workspace_id","status","created_at","updated_at","ok"],"title":"RenderSubmitOut","description":"A freshly submitted render: the job row plus the advisory lint of its composition.\n\nReturned only by the two submit routes (``POST /v1/renders``,\n``POST /v1/projects/{id}/renders``). A *subclass* rather than two more fields on\n:class:`JobOut`, because ``JobOut`` is the shape of a job row on every read route\n(``GET /v1/renders``, all ``/v1/tasks`` routes, the MCP read tools) where a lint\nresult does not exist and would be permanently null.","uniqueKey":"","typeLabel":"RenderSubmitOut · object"},"examples":{"Example":{"title":"Example","value":{"id":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","kind":"render","workspace_id":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","status":"queued","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","ok":true,"is_preview":false,"editor_url":"\u003cstring>","task_type":"transcribe","progress_percent":0,"progress_stage":"compositing","output":{"url":"https://cdn-user.framelane.io/render_01J.../output.mp4","width":1920,"height":1080,"duration":15.3,"size_bytes":12582912},"result":{"language_code":"en","text":"Welcome back to the show."},"error":{"code":"invalid_source","message":"Source URL returned 404."},"metadata":{"project_id":"proj_123","user_ref":"usr_abc"},"completed_at":"2023-11-07T05:31:56Z","violations":[{"code":"\u003cstring>","message":"\u003cstring>","severity":"error","path":"\u003cstring>","pointer":"\u003cstring>","target_id":"\u003cstring>","bbox":[123],"time":123}]}}},"exampleType":"generated"}},"exampleType":"generated"},"42bbb933-a945-4c8d-a876-1c76d2c8c0aa":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"id":{"type":"string","title":"Id","description":"Unique job ID. Prefix indicates type: `render_` or `task_`.","example":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"kind":{"type":"string","enum":["render","task"],"title":"JobKind","description":"Whether this is a `render` or a `task`.","example":"render","isRequired":true,"uniqueKey":"kind","typeLabel":"enum\u003cstring>"},"workspace_id":{"type":"string","title":"Workspace Id","description":"ID of the workspace that owns this job.","example":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","isRequired":true,"uniqueKey":"workspace_id","typeLabel":"string"},"status":{"type":"string","enum":["ingesting","queued","processing","completed","failed","cancelled"],"title":"JobStatus","description":"Current lifecycle state: `queued` → `processing` → `completed` / `failed` / `cancelled`.","x-enumDescriptions":{"ingesting":"External source files are being probed for duration before the render is queued.","queued":"Accepted and waiting for a worker to pick it up.","processing":"Actively rendering or processing.","completed":"Finished successfully; the output artifact is available.","failed":"Terminated with an error (see `error`).","cancelled":"Cancelled by the caller before completion."},"example":"queued","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"ISO-8601 UTC timestamp when the job was created.","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"ISO-8601 UTC timestamp of the last status change.","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"ok":{"type":"boolean","title":"Ok","description":"Advisory — the render was still accepted and dispatched. False means the composition has error-severity findings that will likely make the output wrong (a self-transition, a fully off-canvas element); it does NOT mean the submission was refused. Everything that actually blocks a render is a 422 before you ever see this field.","example":true,"isRequired":true,"uniqueKey":"ok","typeLabel":"boolean"},"is_preview":{"type":"boolean","title":"Is Preview","description":"True for a cheap preview render. Previews are not billed and are excluded from the renders list.","default":false,"example":false,"uniqueKey":"is_preview","typeLabel":"boolean"},"editor_url":{"oneOf":[{"type":"string","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"editor_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Editor Url","description":"Open the project this job was submitted from in the authenticated console. Absent for a job with no project.","uniqueKey":"editor_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"editor_url","typeLabel":"string | null"},"task_type":{"oneOf":[{"type":"string","title":"TaskType","description":"For `task` jobs only — the specific AI operation.","enum":["transcribe"],"x-enumDescriptions":{"transcribe":"Speech-to-text transcription (via AssemblyAI) with optional analysis. Returns the transcript inline on the task's `result` object — there is no file artifact, so `output` is null and `/v1/tasks/{id}/download` returns 404."},"example":"transcribe","uniqueKey":"task_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"For `task` jobs only — the specific AI operation.","example":"transcribe","uniqueKey":"task_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"task_type","typeLabel":"enum\u003cstring> | null"},"progress_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Progress Percent","description":"0–100 progress indicator updated by the render engine.","default":0,"example":0,"uniqueKey":"progress_percent","typeLabel":"integer"},"progress_stage":{"oneOf":[{"type":"string","title":"ProgressStage","description":"Current processing phase within a job.","enum":["downloading","compositing","encoding","uploading"],"x-enumDescriptions":{"downloading":"Fetching source media.","compositing":"Compositing the scene on the GPU.","encoding":"Encoding the output video.","uploading":"Uploading the finished artifact to storage."},"example":"compositing","uniqueKey":"progress_stage.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Current processing phase within a job.","example":"compositing","uniqueKey":"progress_stage.oneOf.1","typeLabel":"null"}],"uniqueKey":"progress_stage","typeLabel":"enum\u003cstring> | null"},"output":{"oneOf":[{"type":"object","title":"JobOutput","description":"Populated once `status == completed`. Contains the signed artifact URL.","properties":{"url":{"oneOf":[{"type":"string","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"output.oneOf.0.url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Url","description":"CDN URL to the completed artifact.","example":"https://cdn-user.framelane.io/render_01J.../output.mp4","uniqueKey":"output.oneOf.0.url.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.url","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"output.oneOf.0.width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Output video width in pixels.","example":1920,"uniqueKey":"output.oneOf.0.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"output.oneOf.0.height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Output video height in pixels.","example":1080,"uniqueKey":"output.oneOf.0.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.height","typeLabel":"integer | null"},"duration":{"oneOf":[{"type":"number","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"output.oneOf.0.duration.oneOf.0","typeLabel":"number"},{"type":"null","title":"Duration","description":"Output duration in seconds.","example":15.3,"uniqueKey":"output.oneOf.0.duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.duration","typeLabel":"number | null"},"size_bytes":{"oneOf":[{"type":"integer","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"output.oneOf.0.size_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Size Bytes","description":"Artifact file size in bytes.","example":12582912,"uniqueKey":"output.oneOf.0.size_bytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"output.oneOf.0.size_bytes","typeLabel":"integer | null"}},"uniqueKey":"output.oneOf.0","typeLabel":"JobOutput · object"},{"type":"null","description":"Populated once `status == completed`. Contains the signed artifact URL.","uniqueKey":"output.oneOf.1","typeLabel":"null"}],"uniqueKey":"output","typeLabel":"JobOutput · object | null"},"result":{"oneOf":[{"type":"object","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"additionalProperties":true,"uniqueKey":"result.oneOf.0","typeLabel":"Result · object"},{"type":"null","title":"Result","description":"Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.","example":{"language_code":"en","text":"Welcome back to the show."},"uniqueKey":"result.oneOf.1","typeLabel":"null"}],"uniqueKey":"result","typeLabel":"Result · object | null"},"error":{"oneOf":[{"type":"object","title":"JobError","description":"Populated when `status == failed`. Contains a structured error code.","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_source","source_not_found","source_too_large","asset_not_ready","codec_unsupported","decode_failed","encode_failed","timeout","out_of_memory","gpu_error","upload_failed","provider_error","ingest_failed","render_refused","internal","cancelled"],"title":"ErrorCode","description":"Machine-readable error code.","x-enumDescriptions":{"invalid_source":"A source URL was malformed or inaccessible.","source_not_found":"A source URL returned 404.","source_too_large":"A source file exceeded the maximum allowed size.","asset_not_ready":"A referenced asset was still ingesting when the job ran.","codec_unsupported":"A source used a codec the renderer cannot decode.","decode_failed":"A source file could not be decoded.","encode_failed":"The output could not be encoded.","timeout":"Processing exceeded the time limit.","out_of_memory":"The renderer ran out of GPU memory.","gpu_error":"A GPU hardware/driver error occurred.","upload_failed":"The output artifact failed to upload to storage.","provider_error":"An upstream provider (e.g. AssemblyAI) returned an error.","ingest_failed":"An external source could not be probed (unreachable, not a media file, or timed out).","render_refused":"The renderer refused the composition by name: a runtime shader that did not compile or ran over its GPU time budget, or an operation, a component or a nested composition it could not apply. `error_message` carries the engine's words; change what it names and submit again.","internal":"An unexpected internal error occurred.","cancelled":"The job was cancelled."},"example":"invalid_source","isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","description":"Human-readable error description.","example":"Source URL returned 404.","isRequired":true,"uniqueKey":"error.oneOf.0.message","typeLabel":"string"}},"uniqueKey":"error.oneOf.0","typeLabel":"JobError · object"},{"type":"null","description":"Populated when `status == failed`. Contains a structured error code.","uniqueKey":"error.oneOf.1","typeLabel":"null"}],"uniqueKey":"error","typeLabel":"JobError · object | null"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Caller-supplied key-value pairs echoed back on every webhook and response.","example":{"project_id":"proj_123","user_ref":"usr_abc"},"uniqueKey":"metadata","typeLabel":"Metadata · object"},"completed_at":{"oneOf":[{"type":"string","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","format":"date-time","uniqueKey":"completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","title":"Completed At","description":"ISO-8601 UTC timestamp when the job reached a terminal state.","uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"completed_at","typeLabel":"string\u003cdate-time> | null"},"violations":{"items":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine code, e.g. 'DANGLING_TRANSITION'.","isRequired":true,"uniqueKey":"violations.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"violations.items.[INDEX].message","typeLabel":"string"},"severity":{"type":"string","enum":["error","warning"],"title":"Severity","description":"'error' blocks a good render; 'warning' is advisory.","default":"error","uniqueKey":"violations.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"path":{"oneOf":[{"type":"string","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.0","typeLabel":"string"},{"type":"null","title":"Path","description":"Where it happened, e.g. 'elements[2]' or 'transitions[0].from_id'.","uniqueKey":"violations.items.[INDEX].path.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].path","typeLabel":"string | null"},"pointer":{"oneOf":[{"type":"string","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.0","typeLabel":"string"},{"type":"null","title":"Pointer","description":"The same place as an RFC 6901 JSON pointer into the request, e.g. '/elements/2/children/0/text_color'.","uniqueKey":"violations.items.[INDEX].pointer.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].pointer","typeLabel":"string | null"},"target_id":{"oneOf":[{"type":"string","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Target Id","description":"Id of the element, frame, instance or group the finding is about; inside an instance, its expanded path (e.g. 'card1/title'). Null when it names none.","uniqueKey":"violations.items.[INDEX].target_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].target_id","typeLabel":"string | null"},"bbox":{"oneOf":[{"type":"array","items":{"type":"number","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0.items.[INDEX]","typeLabel":"number"},"title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.0","typeLabel":"number[]"},{"type":"null","title":"Bbox","description":"Canvas-space box [x, y, w, h] in pixels for layout findings (B1); null otherwise.","uniqueKey":"violations.items.[INDEX].bbox.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].bbox","typeLabel":"number[] | null"},"time":{"oneOf":[{"type":"number","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.0","typeLabel":"number"},{"type":"null","title":"Time","description":"Timeline second at which the finding applies; null for whole-timeline findings.","uniqueKey":"violations.items.[INDEX].time.oneOf.1","typeLabel":"null"}],"uniqueKey":"violations.items.[INDEX].time","typeLabel":"number | null"}},"type":"object","required":["code","message"],"title":"Violation","uniqueKey":"violations.items.[INDEX]","typeLabel":"Violation · object"},"type":"array","title":"Violations","description":"Advisory — the render was still accepted and dispatched. Cross-element and layout findings from the same linter the preview dry-run runs, attached so you can see problems on the render you just paid for instead of only in the artifact. To catch these BEFORE spending a render, call POST /v1/preview with dry_run.Truncated to the first 36 findings (errors first) on very large compositions, with a VIOLATIONS_TRUNCATED marker carrying the full count; the free dry run is never truncated.","uniqueKey":"violations","typeLabel":"Violation · object[]"}},"type":"object","required":["id","kind","workspace_id","status","created_at","updated_at","ok"],"title":"RenderSubmitOut","description":"A freshly submitted render: the job row plus the advisory lint of its composition.\n\nReturned only by the two submit routes (``POST /v1/renders``,\n``POST /v1/projects/{id}/renders``). A *subclass* rather than two more fields on\n:class:`JobOut`, because ``JobOut`` is the shape of a job row on every read route\n(``GET /v1/renders``, all ``/v1/tasks`` routes, the MCP read tools) where a lint\nresult does not exist and would be permanently null.","uniqueKey":"","typeLabel":"RenderSubmitOut · object"},"examples":{"Example":{"title":"Example","value":{"id":"render_01J8QR2K5VKDGN2T4FBM3CZYX7","kind":"render","workspace_id":"ws_01J8QR2K5VKDGN2T4FBM3CZYX8","status":"queued","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","ok":true,"is_preview":false,"editor_url":"\u003cstring>","task_type":"transcribe","progress_percent":0,"progress_stage":"compositing","output":{"url":"https://cdn-user.framelane.io/render_01J.../output.mp4","width":1920,"height":1080,"duration":15.3,"size_bytes":12582912},"result":{"language_code":"en","text":"Welcome back to the show."},"error":{"code":"invalid_source","message":"Source URL returned 404."},"metadata":{"project_id":"proj_123","user_ref":"usr_abc"},"completed_at":"2023-11-07T05:31:56Z","violations":[{"code":"\u003cstring>","message":"\u003cstring>","severity":"error","path":"\u003cstring>","pointer":"\u003cstring>","target_id":"\u003cstring>","bbox":[123],"time":123}]}}},"exampleType":"generated"}},"exampleType":"generated"},"aa221757-5c49-4dc5-a8a5-eff5d1421684":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"6ebbd611-182b-4e9c-b591-330d0199956a":{"description":"Free-tier render quota exceeded (upgrade to continue).","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"20486bf1-caf4-4e88-9cac-6cc438f0abdb":{"description":"Idempotency conflict (different body for the same key).","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"934b8e3d-f210-4719-9644-df7937c98cd7":{"description":"Validation error or unsupported feature.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"},"a882a748-ca2e-4510-b299-beeb04d39616":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"description":"The error envelope returned on every 4xx/5xx response: `{\"error\": {...}}`.","properties":{"error":{"description":"The structured error body — the value of the `error` key on an error response.","properties":{"code":{"description":"Machine-readable error code returned on a 4xx/5xx response. Branch on `error.code` to\nhandle failures programmatically.\n\nValues:\n- `invalid_request` — The request was malformed or failed validation.\n- `unauthorized` — Missing or invalid API key.\n- `forbidden` — Authenticated but not permitted to perform this action.\n- `not_found` — The requested resource does not exist.\n- `conflict` — Conflicts with current state (e.g. a reused Idempotency-Key with a different body).\n- `unsupported_feature` — The composition uses a feature the renderer does not support.\n- `invalid_source` — A source URL is malformed or unreachable.\n- `source_not_found` — A referenced source file could not be found.\n- `source_too_large` — A source file exceeds the allowed size.\n- `asset_not_ready` — A referenced asset is still ingesting and is not ready yet.\n- `ingest_failed` — Copying an external source into Framelane storage failed.\n- `codec_unsupported` — A source uses a codec the renderer cannot decode.\n- `quota_exceeded` — The workspace has exhausted its plan quota (HTTP 402).\n- `rate_limited` — Too many requests; retry after the Retry-After interval.\n- `internal` — An unexpected server error occurred.\n- `email_not_verified` — The workspace email is unverified; verify it before making authed calls.\n- `email_in_use` — The email is already associated with another workspace.\n- `invalid_otp` — The verification code is incorrect or expired.\n- `unsupported_content_type` — The provided content type is not supported.\n- `plan_required` — The feature needs a higher plan (HTTP 402); `details.required_plan` names it.\n- `admin_only` — Only an admin workspace may call this route (HTTP 403).\n- `template_assets_not_shared` — A published template may reference only shared CDN media; `details.urls` lists the rest.\n- `template_has_webhook` — A published template may not carry a `webhook_url`: every copy of it would notify that URL.\n- `http_error` — A generic HTTP error not covered by a more specific code.\n- `shader_compile_error` — A shader's SkSL did not compile; `details.errors` gives each error's line and column.\n- `shader_compiler_unavailable` — The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).\n- `shader_not_found` — An effect names a shader id that is neither this workspace's nor shared.\n- `shader_param_invalid` — An effect sets a shader param the shader does not declare, or a value of the wrong type or range.","enum":["invalid_request","unauthorized","forbidden","not_found","conflict","unsupported_feature","invalid_source","source_not_found","source_too_large","asset_not_ready","ingest_failed","codec_unsupported","quota_exceeded","rate_limited","internal","email_not_verified","email_in_use","invalid_otp","unsupported_content_type","inline_too_large","plan_required","admin_only","template_assets_not_shared","template_has_webhook","http_error","shader_compile_error","shader_compiler_unavailable","shader_not_found","shader_param_invalid"],"title":"ErrorCode","type":"string","x-enumDescriptions":{"invalid_request":"The request was malformed or failed validation.","unauthorized":"Missing or invalid API key.","forbidden":"Authenticated but not permitted to perform this action.","not_found":"The requested resource does not exist.","conflict":"Conflicts with current state (e.g. a reused Idempotency-Key with a different body).","unsupported_feature":"The composition uses a feature the renderer does not support.","invalid_source":"A source URL is malformed or unreachable.","source_not_found":"A referenced source file could not be found.","source_too_large":"A source file exceeds the allowed size.","asset_not_ready":"A referenced asset is still ingesting and is not ready yet.","ingest_failed":"Copying an external source into Framelane storage failed.","codec_unsupported":"A source uses a codec the renderer cannot decode.","quota_exceeded":"The workspace has exhausted its plan quota (HTTP 402).","rate_limited":"Too many requests; retry after the Retry-After interval.","internal":"An unexpected server error occurred.","email_not_verified":"The workspace email is unverified; verify it before making authed calls.","email_in_use":"The email is already associated with another workspace.","invalid_otp":"The verification code is incorrect or expired.","unsupported_content_type":"The provided content type is not supported.","plan_required":"The feature needs a higher plan (HTTP 402); `details.required_plan` names it.","admin_only":"Only an admin workspace may call this route (HTTP 403).","template_assets_not_shared":"A published template may reference only shared CDN media; `details.urls` lists the rest.","template_has_webhook":"A published template may not carry a `webhook_url`: every copy of it would notify that URL.","http_error":"A generic HTTP error not covered by a more specific code.","shader_compile_error":"A shader's SkSL did not compile; `details.errors` gives each error's line and column.","shader_compiler_unavailable":"The shader compiler is not installed on this deployment or did not answer in time (HTTP 503).","shader_not_found":"An effect names a shader id that is neither this workspace's nor shared.","shader_param_invalid":"An effect sets a shader param the shader does not declare, or a value of the wrong type or range."},"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"oneOf":[{"type":"object","title":"Details","additionalProperties":true,"uniqueKey":"error.details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"Details · object | null"}},"required":["code","message"],"title":"ErrorResponse","type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"ErrorResponse · object"}},"required":["error"],"title":"ApiError","type":"object","uniqueKey":"","typeLabel":"ApiError · object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_request","message":"\u003cstring>","details":{}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"d4cf0361-3beb-4284-bf49-b5e629e110b2":{"ApiKey":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"ApiKey"}}},"servers":{"374e059c-6af0-4c50-a102-7400af30babb":{"url":"https://api.framelane.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"ApiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKey","name":"Authorization"}],"title":"ApiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"itis-c7dc7146","siteName":"Framelane","title":"Submit a render job - Framelane","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-25T13:55:55.521Z","originalFileLocation":"api-reference/renders/submit-a-render-job.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Framelane\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Submit a render job - Framelane\">\u003cmeta data-mint-head property=\"og:description\" content=\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Framelane\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.framelane.io/api-reference/renders/submit-a-render-job\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cdn-assets.framelane.io/shared/images/og-docs.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Submit a render job - Framelane\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cdn-assets.framelane.io/shared/images/og-docs.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/itis-c7dc7146/3AM3-gs_iChWRW0W/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Framelane\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0070f3\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.framelane.io/api-reference/renders/submit-a-render-job\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/renders/submit-a-render-job.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.framelane.io/#organization\",\"name\":\"Framelane\",\"url\":\"https://docs.framelane.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/itis-c7dc7146/I-4ZfymyiJyBmcDs/logo/framelane-light.png?fit=max\u0026auto=format\u0026n=I-4ZfymyiJyBmcDs\u0026q=85\u0026s=a819adfb6e5b9a97575f20c034d41c77\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.framelane.io#website\",\"name\":\"Framelane\",\"url\":\"https://docs.framelane.io\",\"publisher\":{\"@id\":\"https://docs.framelane.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job#webpage\",\"url\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job\",\"name\":\"Submit a render job\",\"description\":\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\",\"dateModified\":\"2026-10-25T13:55:55.521Z\",\"isPartOf\":{\"@id\":\"https://docs.framelane.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Framelane\",\"item\":\"https://docs.framelane.io\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Submit a render job\",\"item\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job#apireference\",\"headline\":\"Submit a render job\",\"name\":\"Submit a render job\",\"description\":\"Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates. The response carries an ADVISORY ok + violations[] lint of the composition: the render is dispatched either way, and anything that actually blocks a submit is a 422 instead.\",\"url\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job\",\"mainEntityOfPage\":{\"@id\":\"https://docs.framelane.io/api-reference/renders/submit-a-render-job#webpage\"},\"image\":\"https://cdn-assets.framelane.io/shared/images/og-docs.png\",\"dateModified\":\"2026-10-25T13:55:55.521Z\",\"publisher\":{\"@id\":\"https://docs.framelane.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.framelane.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Framelane\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Framelane","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/framelane"},{"anchor":"Status","icon":"signal-bars","href":"https://status.framelane.io"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/mcp/overview"}]},{"tab":"API Reference","groups":[{"group":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"},{"title":"RenderRequest schema reference","href":"/api-reference/render-request"}]},{"group":"Discovery","pages":[{"title":"List render and task capabilities","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/capabilities","href":"/api-reference/capabilities/list-render-and-task-capabilities"}]},{"group":"Onboarding","pages":[{"title":"Create a workspace and send an OTP verification email","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/signup","href":"/api-reference/signup/create-a-workspace-and-send-an-otp-verification-email"},{"title":"Verify email with OTP code","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/signup/verify","href":"/api-reference/signup/verify-email-with-otp-code"},{"title":"Sync a Clerk session to a Framelane workspace","description":"Verify a Clerk session token and create, adopt or return the workspace for that Clerk user. On first login a Workspace and initial API key are created and the plaintext key is returned once. If an email-signup workspace already exists for the verified Clerk primary email it is adopted instead, keeping its projects, billing and verified keys. Subsequent logins return the workspace without exposing a key.","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/auth/sync","href":"/api-reference/auth/sync-a-clerk-session-to-a-framelane-workspace"}]},{"group":"Renders","pages":[{"title":"Submit a render job","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/renders","href":"/api-reference/renders/submit-a-render-job"},{"title":"List renders","description":"Returns a cursor-paginated list of render jobs for the authenticated workspace.","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders","href":"/api-reference/renders/list-renders"},{"title":"Get a render","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}","href":"/api-reference/renders/get-a-render"},{"title":"Cancel a render","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/renders/{render_id}","href":"/api-reference/renders/cancel-a-render"},{"title":"Download render artifact","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}/download","href":"/api-reference/renders/download-render-artifact"},{"title":"Get render poster image","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/renders/{render_id}/poster","href":"/api-reference/renders/get-render-poster-image"}]},{"group":"Preview","pages":[{"title":"Validate or preview a composition","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/preview","href":"/api-reference/preview/validate-or-preview-a-composition"}]},{"group":"Projects","pages":[{"title":"Create a project","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects","href":"/api-reference/projects/create-a-project"},{"title":"List projects","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/projects","href":"/api-reference/projects/list-projects"},{"title":"Get a project","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/projects/{project_id}","href":"/api-reference/projects/get-a-project"},{"title":"Rename a project","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/projects/{project_id}","href":"/api-reference/projects/rename-a-project"},{"title":"Delete a project","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/projects/{project_id}","href":"/api-reference/projects/delete-a-project"},{"title":"Apply targeted edits","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/ops","href":"/api-reference/projects/apply-targeted-edits"},{"title":"Preview or validate the project head","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/preview","href":"/api-reference/projects/preview-or-validate-the-project-head"},{"title":"Refresh the project thumbnail","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/thumbnail","href":"/api-reference/projects/refresh-the-project-thumbnail"},{"title":"Render the project head","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/projects/{project_id}/renders","href":"/api-reference/projects/render-the-project-head"}]},{"group":"Templates","pages":[{"title":"Templates","href":"/api-reference/templates"},{"title":"List templates","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/templates","href":"/api-reference/templates/list-templates"},{"title":"Get a template","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/templates/{id_or_slug}","href":"/api-reference/templates/get-a-template"},{"title":"Publish a template","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/templates","href":"/api-reference/templates/publish-a-template"},{"title":"Update a template listing","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/templates/{listing_id}","href":"/api-reference/templates/update-a-template-listing"},{"title":"Unpublish a template","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/templates/{listing_id}","href":"/api-reference/templates/unpublish-a-template"}]},{"group":"Brand Kits","pages":[{"title":"Extract a brand kit from a URL","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/brand-kits","href":"/api-reference/brand-kits/extract-a-brand-kit-from-a-url"},{"title":"List brand kits","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/brand-kits","href":"/api-reference/brand-kits/list-brand-kits"},{"title":"Get a brand kit","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/get-a-brand-kit"},{"title":"Override brand kit fields","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/override-brand-kit-fields"},{"title":"Delete a brand kit","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/delete-a-brand-kit"}]},{"group":"Shaders","pages":[{"title":"Runtime shaders","href":"/api-reference/shaders"},{"title":"Compile and store a shader","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders","href":"/api-reference/shaders/compile-and-store-a-shader"},{"title":"List shaders","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/shaders","href":"/api-reference/shaders/list-shaders"},{"title":"Get a shader","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/shaders/{shader_id}","href":"/api-reference/shaders/get-a-shader"},{"title":"Delete a shader","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/shaders/{shader_id}","href":"/api-reference/shaders/delete-a-shader"},{"title":"Render one frame of a shader","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/shaders/{shader_id}/probe","href":"/api-reference/shaders/render-one-frame-of-a-shader"}]},{"group":"Tasks","pages":[{"title":"Transcribe task","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/tasks/transcribe","href":"/api-reference/tasks/transcribe-task"},{"title":"List tasks","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks","href":"/api-reference/tasks/list-tasks"},{"title":"Get a task","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks/{task_id}","href":"/api-reference/tasks/get-a-task"},{"title":"Cancel a task","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/tasks/{task_id}","href":"/api-reference/tasks/cancel-a-task"},{"title":"Download task artifact","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/tasks/{task_id}/download","href":"/api-reference/tasks/download-task-artifact"}]},{"group":"Uploads","pages":[{"title":"Request a file upload URL","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/uploads","href":"/api-reference/uploads/request-a-file-upload-url"}]},{"group":"Webhooks","pages":[{"title":"Register webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks","href":"/api-reference/webhooks/register-webhook"},{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Get webhook","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/get-webhook"},{"title":"Update webhook","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/update-webhook"},{"title":"Delete webhook","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/webhooks/{webhook_id}","href":"/api-reference/webhooks/delete-webhook"},{"title":"Send test event","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/test","href":"/api-reference/webhooks/send-test-event"},{"title":"Rotate signing secret","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/rotate-secret","href":"/api-reference/webhooks/rotate-signing-secret"},{"title":"List delivery attempts","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/webhooks/{webhook_id}/deliveries","href":"/api-reference/webhooks/list-delivery-attempts"},{"title":"Retry a delivery","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{webhook_id}/deliveries/{delivery_id}/retry","href":"/api-reference/webhooks/retry-a-delivery"}]},{"group":"Account","pages":[{"group":"Workspace","pages":[{"title":"Get workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace","href":"/api-reference/workspace/get-workspace"},{"title":"Update workspace","deprecated":null,"version":null,"openapi":"/openapi.json patch /v1/workspace","href":"/api-reference/workspace/update-workspace"},{"title":"Get workspace usage","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace/usage","href":"/api-reference/workspace/get-workspace-usage"},{"title":"List workspace media assets","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/workspace/assets","href":"/api-reference/workspace/list-workspace-media-assets"},{"title":"Delete workspace","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/workspace","href":"/api-reference/workspace/delete-workspace"}]},{"group":"API Keys","pages":[{"title":"Create API key","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/api-keys","href":"/api-reference/api-keys/create-api-key"},{"title":"List API keys","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Revoke API key","deprecated":null,"version":null,"openapi":"/openapi.json delete /v1/api-keys/{key_id}","href":"/api-reference/api-keys/revoke-api-key"}]},{"group":"Billing","pages":[{"title":"Create a Paddle Customer Portal session","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/billing/portal","href":"/api-reference/billing/create-a-paddle-customer-portal-session"}]}]}]}]},"title":"Submit a render job - Framelane","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}