@vanillaskyai/video 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -0
- package/PUBLIC-API.md +123 -9
- package/README.md +69 -115
- package/dist/{bg-confetti-SHQI7ATB.js → bg-confetti-HITCGLGD.js} +1 -1
- package/dist/{bg-emoji-XYFRA63Q.js → bg-emoji-VU4UZYZN.js} +1 -1
- package/dist/{bg-media-G4XOQEAS.js → bg-media-L34PDQXJ.js} +2 -2
- package/dist/{brand-message-XHONEDNW.js → brand-message-FUJ4STFO.js} +1 -1
- package/dist/{builtin-server-YHEZ2JRF.js → builtin-server-KB7FKF6A.js} +2 -2
- package/dist/{chart-bar-HRHD57ML.js → chart-bar-EGPHJATL.js} +2 -2
- package/dist/{chart-counter-KFPV44RB.js → chart-counter-5FFWQNZO.js} +2 -2
- package/dist/{chart-progress-ring-OR2VOIHV.js → chart-progress-ring-JMXQLMLC.js} +2 -2
- package/dist/{chunk-66MNRUCR.js → chunk-2PYO6VAC.js} +51 -3
- package/dist/{chunk-ZQQQAAKP.js → chunk-2XT4MZ76.js} +33 -2
- package/dist/{chunk-PNS52FL4.js → chunk-5SLENAJW.js} +19 -6
- package/dist/{chunk-EFL34TXF.js → chunk-AITKH6QT.js} +24 -8
- package/dist/{chunk-FZHMQFG3.js → chunk-GAIOHGNR.js} +5 -21
- package/dist/{chunk-3RV4YKB3.js → chunk-JNN3EYVP.js} +51 -26
- package/dist/{chunk-HVCPEAQF.js → chunk-LKBZX7GV.js} +9 -6
- package/dist/{chunk-G66Z5CWR.js → chunk-MMUXVA47.js} +27 -3
- package/dist/{chunk-7BGAU6C3.js → chunk-MXZSDGZQ.js} +2 -1
- package/dist/{chunk-3OU7HIEB.js → chunk-RE4IMWJR.js} +15 -31
- package/dist/{chunk-FVTMYS6U.js → chunk-RGF452LL.js} +1 -1
- package/dist/{chunk-34O5BY6X.js → chunk-RXHW4EP4.js} +21 -4
- package/dist/chunk-SKRGRKHY.js +142 -0
- package/dist/{chunk-TCEHK2BW.js → chunk-YJJC4N4D.js} +2 -1
- package/dist/cli.js +438 -30
- package/dist/{compose-video-JWIEDTEJ.js → compose-video-PD6LKKRK.js} +4 -4
- package/dist/{cta-logo-JJOGK4UC.js → cta-logo-YR7LYUR5.js} +1 -1
- package/dist/{cta-media-IQ3MAWEH.js → cta-media-DQJBKUO2.js} +2 -2
- package/dist/{events-BBP30j3c.d.ts → events-B6qS1Lsb.d.ts} +2 -2
- package/dist/{incoming-call-KXF67OT2.js → incoming-call-54KQ7O5A.js} +1 -1
- package/dist/index.d.ts +89 -3
- package/dist/index.js +12 -1
- package/dist/{infographic-before-after-2I7YZVDD.js → infographic-before-after-ROS52GOW.js} +1 -1
- package/dist/{infographic-feature-list-QDM4I7XE.js → infographic-feature-list-E7MGUDAN.js} +2 -2
- package/dist/{infographic-problem-solution-FMLJCPG6.js → infographic-problem-solution-3S6NGO5N.js} +2 -2
- package/dist/{infographic-stat-row-VFTIXS5F.js → infographic-stat-row-SYB7AB7H.js} +2 -2
- package/dist/{infographic-steps-L7W24Z35.js → infographic-steps-KCE6JWE2.js} +2 -2
- package/dist/{kit-DEG3fcaL.d.ts → kit-8g46H2RZ.d.ts} +1 -1
- package/dist/{prompt-input-F3CYU2XH.js → prompt-input-MHX4O42G.js} +1 -1
- package/dist/react.d.ts +194 -6
- package/dist/react.js +1849 -40
- package/dist/{reaction-2XCLOJOK.js → reaction-SLEGR3BE.js} +2 -2
- package/dist/server.d.ts +102 -4
- package/dist/server.js +972 -27
- package/dist/{showcase-code-KHSMIPG6.js → showcase-code-2HLAVKBM.js} +2 -2
- package/dist/{showcase-phone-M4CEANIW.js → showcase-phone-Q4HEO4LH.js} +2 -2
- package/dist/{showcase-terminal-26I3DYF7.js → showcase-terminal-DL45LUFG.js} +2 -2
- package/dist/{showcase-web-TY6CZV2Z.js → showcase-web-2QZO73FZ.js} +2 -2
- package/dist/{social-milestone-TF6MX7ET.js → social-milestone-GEFUQSBF.js} +1 -1
- package/dist/{social-notification-2RJDAZSF.js → social-notification-FJ5VHVLK.js} +1 -1
- package/dist/{social-review-stack-2ICKJQG7.js → social-review-stack-KXQCKFRP.js} +1 -1
- package/dist/{social-testimonial-X7OGADA3.js → social-testimonial-JZ7CHC7S.js} +1 -1
- package/dist/{social-tweet-TK7SH2F6.js → social-tweet-UCDXM25F.js} +1 -1
- package/dist/{system-prompt-4I6Z5HK3.js → system-prompt-RRXIWDDD.js} +5 -3
- package/dist/template-catalog.js +1 -1
- package/dist/templates.d.ts +3 -3
- package/dist/test.d.ts +2 -2
- package/dist/test.js +3 -3
- package/dist/{text-stream-J6EDDJP4.js → text-stream-FW4BLBAL.js} +2 -2
- package/dist/{types-BV9IqExh.d.ts → types-2wHBqtg8.d.ts} +29 -1
- package/dist/types-DrABlRa7.d.ts +46 -0
- package/docs/agent-integration.md +49 -25
- package/docs/architecture.md +37 -22
- package/docs/branding-and-personalization.md +1 -1
- package/docs/concepts.md +14 -0
- package/docs/custom-templates.md +9 -9
- package/docs/customization.md +41 -5
- package/docs/getting-started.md +81 -84
- package/docs/media-and-audio.md +103 -166
- package/docs/persistence.md +1 -1
- package/docs/production.md +81 -92
- package/docs/prompt-and-input.md +71 -161
- package/docs/provider-integration.md +91 -49
- package/docs/responsive-orientation.md +1 -1
- package/docs/security.md +6 -5
- package/docs/streaming-protocol.md +1 -1
- package/docs/testing.md +51 -43
- package/examples/custom-template/README.md +1 -1
- package/package.json +20 -22
- package/registry/items/barChart.json +6 -4
- package/registry/items/beforeAfter.json +1 -1
- package/registry/items/bigNumber.json +4 -3
- package/registry/items/brandMessage.json +3 -2
- package/registry/items/cardList.json +6 -4
- package/registry/items/codeEditor.json +4 -3
- package/registry/items/confetti.json +1 -1
- package/registry/items/ctaLogo.json +3 -2
- package/registry/items/ctaMedia.json +4 -3
- package/registry/items/emojiBurst.json +1 -1
- package/registry/items/incomingCall.json +3 -2
- package/registry/items/media.json +4 -3
- package/registry/items/milestone.json +3 -2
- package/registry/items/notification.json +3 -2
- package/registry/items/phoneMockup.json +4 -3
- package/registry/items/problemSolution.json +4 -3
- package/registry/items/progressRing.json +4 -3
- package/registry/items/promptInput.json +3 -2
- package/registry/items/reaction.json +2 -2
- package/registry/items/reviewStack.json +3 -2
- package/registry/items/steps.json +6 -4
- package/registry/items/terminal.json +5 -4
- package/registry/items/testimonial.json +3 -2
- package/registry/items/tripleStats.json +4 -3
- package/registry/items/tweet.json +3 -2
- package/registry/items/webMockup.json +4 -3
- package/starters/video-chat/.env.example +16 -0
- package/starters/video-chat/README.md +63 -0
- package/starters/video-chat/index.html +12 -0
- package/starters/video-chat/package.json +28 -0
- package/starters/video-chat/server.ts +152 -0
- package/starters/video-chat/src/main.tsx +8 -0
- package/starters/video-chat/stock.ts +139 -0
- package/starters/video-chat/tsconfig.json +20 -0
- package/starters/video-chat/vite.config.ts +81 -0
- package/styles/video-chat.css +713 -0
- package/docs/input-and-first-scene.md +0 -64
- package/docs/integrate-nextjs.md +0 -86
- package/docs/live-channels.md +0 -149
- package/docs/use-cases.md +0 -59
- package/examples/nextjs-quickstart/.env.example +0 -2
- package/examples/nextjs-quickstart/README.md +0 -27
- package/examples/nextjs-quickstart/next-env.d.ts +0 -4
- package/examples/nextjs-quickstart/package.json +0 -25
- package/examples/nextjs-quickstart/src/app/api/video/route.ts +0 -33
- package/examples/nextjs-quickstart/src/app/layout.tsx +0 -5
- package/examples/nextjs-quickstart/src/app/page.tsx +0 -31
- package/examples/nextjs-quickstart/tsconfig.json +0 -26
- package/examples/server-integrations/README.md +0 -20
- package/examples/server-integrations/src/ai-sdk-media.ts +0 -90
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
SceneBackground,
|
|
7
7
|
getMediaBackgroundProps
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-MXZSDGZQ.js";
|
|
9
9
|
import {
|
|
10
10
|
TemplateText
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-YJJC4N4D.js";
|
|
12
12
|
import "./chunk-L5BTTCZV.js";
|
|
13
13
|
import "./chunk-FRN6WKHA.js";
|
|
14
14
|
import {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
VIDEO_PROTOCOL_VERSION,
|
|
2
3
|
VIDEO_SCHEMA_VERSION
|
|
3
4
|
} from "./chunk-AOWSXU2K.js";
|
|
4
5
|
import {
|
|
@@ -273,7 +274,8 @@ function validateScene(value, path) {
|
|
|
273
274
|
"variables",
|
|
274
275
|
"textArchetype",
|
|
275
276
|
"backgroundEffect",
|
|
276
|
-
"timing"
|
|
277
|
+
"timing",
|
|
278
|
+
"narration"
|
|
277
279
|
], path);
|
|
278
280
|
nonEmptyString(requiredField(result, "id", `${path}.id`), `${path}.id`, 128);
|
|
279
281
|
nonEmptyString(requiredField(result, "templateId", `${path}.templateId`), `${path}.templateId`, 128);
|
|
@@ -285,6 +287,8 @@ function validateScene(value, path) {
|
|
|
285
287
|
const field = ownField(result, key, `${path}.${key}`);
|
|
286
288
|
if (field.present) nonEmptyString(field.value, `${path}.${key}`, 128);
|
|
287
289
|
}
|
|
290
|
+
const narration = ownField(result, "narration", `${path}.narration`);
|
|
291
|
+
if (narration.present) nonEmptyString(narration.value, `${path}.narration`, 4e3);
|
|
288
292
|
return result;
|
|
289
293
|
}
|
|
290
294
|
function validateStyle(value, path) {
|
|
@@ -296,7 +300,8 @@ function validateStyle(value, path) {
|
|
|
296
300
|
"defaultTextArchetype",
|
|
297
301
|
"defaultTransition",
|
|
298
302
|
"density",
|
|
299
|
-
"motion"
|
|
303
|
+
"motion",
|
|
304
|
+
"generatedLook"
|
|
300
305
|
], path);
|
|
301
306
|
const brandValue = requiredField(result, "brand", `${path}.brand`);
|
|
302
307
|
const brand = record(brandValue, `${path}.brand`);
|
|
@@ -305,6 +310,8 @@ function validateStyle(value, path) {
|
|
|
305
310
|
if (field.present) nonEmptyString(field.value, `${path}.brand.${key}`);
|
|
306
311
|
}
|
|
307
312
|
validateVideoBrand(brandValue, `${path}.brand`);
|
|
313
|
+
const look = ownField(result, "generatedLook", `${path}.generatedLook`);
|
|
314
|
+
if (look.present) nonEmptyString(look.value, `${path}.generatedLook`, 1e3);
|
|
308
315
|
for (const key of [
|
|
309
316
|
"preset",
|
|
310
317
|
"defaultBackgroundEffect",
|
|
@@ -494,11 +501,52 @@ function parseVideo(value) {
|
|
|
494
501
|
}
|
|
495
502
|
}
|
|
496
503
|
|
|
504
|
+
// src/protocol/stable-json.ts
|
|
505
|
+
function stableJson(value) {
|
|
506
|
+
if (value == null || typeof value !== "object") return JSON.stringify(value);
|
|
507
|
+
if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
|
|
508
|
+
const entries = Object.entries(value).filter(([, child]) => child !== void 0).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
|
|
509
|
+
return `{${entries.map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// src/protocol/checksum.ts
|
|
513
|
+
function checksumVideo(config) {
|
|
514
|
+
const input = stableJson(config);
|
|
515
|
+
let hash = 2166136261;
|
|
516
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
517
|
+
hash ^= input.charCodeAt(index);
|
|
518
|
+
hash = Math.imul(hash, 16777619) >>> 0;
|
|
519
|
+
}
|
|
520
|
+
return `fnv1a32:${hash.toString(16).padStart(8, "0")}`;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// src/protocol/events.ts
|
|
524
|
+
function createVideoEventFactory(options) {
|
|
525
|
+
let sequence = options.initialSequence ?? 0;
|
|
526
|
+
return {
|
|
527
|
+
create(type, data) {
|
|
528
|
+
const currentSequence = sequence;
|
|
529
|
+
sequence += 1;
|
|
530
|
+
return {
|
|
531
|
+
protocolVersion: VIDEO_PROTOCOL_VERSION,
|
|
532
|
+
runId: options.runId,
|
|
533
|
+
sequence: currentSequence,
|
|
534
|
+
eventId: `${options.runId}:${currentSequence}`,
|
|
535
|
+
type,
|
|
536
|
+
data
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
497
542
|
export {
|
|
498
543
|
MAX_RETAINED_SOURCE_LENGTH,
|
|
499
544
|
MAX_RETAINED_INSTRUCTIONS_LENGTH,
|
|
500
545
|
MAX_RETAINED_MEDIA_URLS,
|
|
501
546
|
MAX_RETAINED_MEDIA_URL_LENGTH,
|
|
502
547
|
VideoValidationError,
|
|
503
|
-
parseVideo
|
|
548
|
+
parseVideo,
|
|
549
|
+
stableJson,
|
|
550
|
+
checksumVideo,
|
|
551
|
+
createVideoEventFactory
|
|
504
552
|
};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseVideoEvent
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MMUXVA47.js";
|
|
4
|
+
import {
|
|
5
|
+
MAX_RETAINED_MEDIA_URL_LENGTH
|
|
6
|
+
} from "./chunk-2PYO6VAC.js";
|
|
4
7
|
import {
|
|
5
8
|
VIDEO_PROTOCOL_VERSION
|
|
6
9
|
} from "./chunk-AOWSXU2K.js";
|
|
@@ -92,10 +95,38 @@ function videoSseHeaders(headers) {
|
|
|
92
95
|
return result;
|
|
93
96
|
}
|
|
94
97
|
|
|
98
|
+
// src/video-chat/media.ts
|
|
99
|
+
function sanitizeVideoChatMedia(value) {
|
|
100
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
101
|
+
const media = value;
|
|
102
|
+
if (media.type !== "image" && media.type !== "video") return null;
|
|
103
|
+
if (typeof media.url !== "string") return null;
|
|
104
|
+
const url = media.url.trim();
|
|
105
|
+
if (!safeMediaUrl(url)) return null;
|
|
106
|
+
if (media.posterUrl != null && typeof media.posterUrl !== "string") return null;
|
|
107
|
+
const posterUrl = typeof media.posterUrl === "string" ? media.posterUrl.trim() : "";
|
|
108
|
+
if (posterUrl && !safeMediaUrl(posterUrl)) return null;
|
|
109
|
+
return {
|
|
110
|
+
url,
|
|
111
|
+
type: media.type,
|
|
112
|
+
...posterUrl ? { posterUrl } : {}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function safeMediaUrl(value) {
|
|
116
|
+
if (!value || value.length > MAX_RETAINED_MEDIA_URL_LENGTH) return false;
|
|
117
|
+
try {
|
|
118
|
+
const protocol = new URL(value).protocol;
|
|
119
|
+
return protocol === "https:" || protocol === "http:";
|
|
120
|
+
} catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
95
125
|
export {
|
|
96
126
|
VIDEO_STREAM_HEADER,
|
|
97
127
|
VIDEO_STREAM_CONTENT_TYPE,
|
|
98
128
|
encodeVideoSseEvent,
|
|
99
129
|
decodeVideoSse,
|
|
100
|
-
videoSseHeaders
|
|
130
|
+
videoSseHeaders,
|
|
131
|
+
sanitizeVideoChatMedia
|
|
101
132
|
};
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
// src/server/prompts/system-prompt.ts
|
|
2
|
-
|
|
2
|
+
function videoPlanInstruction(narrate = false) {
|
|
3
|
+
const narration = narrate ? `,"narration":"one sentence said aloud over this scene"` : "";
|
|
4
|
+
return `Wire format: newline-delimited JSON (NDJSON), exactly one complete JSON object per line.
|
|
3
5
|
Allowed plan parts:
|
|
4
|
-
{"type":"scene.add","scene":{"id":"stable-id","templateId":"trusted-template-id","variables":{},"timing":{"fixedDuration":4}}}
|
|
5
|
-
{"type":"scene.add","placement":"closer","scene":{"id":"closer","templateId":"trusted-closer-template-id","variables":{},"timing":{"fixedDuration":3}}}
|
|
6
|
+
{"type":"scene.add","scene":{"id":"stable-id","templateId":"trusted-template-id","variables":{},"timing":{"fixedDuration":4}${narration}}}
|
|
7
|
+
{"type":"scene.add","placement":"closer","scene":{"id":"closer","templateId":"trusted-closer-template-id","variables":{},"timing":{"fixedDuration":3}${narration}}}
|
|
6
8
|
{"type":"plan.complete","finishReason":"stop"}
|
|
7
9
|
Do not emit protocol envelopes, Markdown fences, comments, prose, partial objects, audio, generated source, or any part type not listed above.`;
|
|
10
|
+
}
|
|
11
|
+
var VIDEO_PLAN_INSTRUCTION = videoPlanInstruction();
|
|
8
12
|
function knowledgeRules(mode) {
|
|
9
13
|
return mode === "general" ? `- This request uses general knowledge mode.
|
|
10
14
|
- Use stable general knowledge to answer or develop the supplied request. Prefer broadly established, non-current information.
|
|
11
15
|
- Answer the request directly. Do not make missing source detail the subject when stable general knowledge can provide a useful answer; for broad questions, provide a practical, broadly applicable framework.
|
|
12
|
-
- For financial, medical, or legal topics, keep guidance general and
|
|
16
|
+
- For financial, medical, or legal topics, keep guidance general and informational. Never present it as personalized professional advice.
|
|
13
17
|
- Treat claims in the supplied input as authoritative. Never invent citations, quotations, URLs, personal details, live facts, guarantees, or precise claims that require a source.` : `- This request uses input-only knowledge mode.
|
|
14
18
|
- The supplied input is the complete factual basis. Do not add outside claims.`;
|
|
15
19
|
}
|
|
16
|
-
|
|
20
|
+
var NARRATION_RULES = `
|
|
21
|
+
Narration rules:
|
|
22
|
+
- Every scene.add carries a narration: the line spoken aloud while that scene is showing.
|
|
23
|
+
- One sentence, 10-16 words, plain spoken English. It is heard, never drawn.
|
|
24
|
+
- Say what the scene shows and why it matters. Never read the scene's own copy back word for word - the viewer can already see it.
|
|
25
|
+
- The lines are one continuous explanation: each follows from the ones before it. Never mention scenes, videos, slides, or yourself.`;
|
|
26
|
+
function createVideoSystemPrompt(knowledgeMode = "input-only", narrate = false) {
|
|
17
27
|
return `You are a video director.
|
|
18
28
|
|
|
19
29
|
Turn the supplied input into a concise, coherent sequence using trusted scene templates. Never return prose as the deliverable and never generate HTML, React, JavaScript, CSS, or animation source.
|
|
@@ -43,11 +53,14 @@ Streaming rules:
|
|
|
43
53
|
- End explicitly with plan.complete. A truncated stream is never treated as complete.
|
|
44
54
|
- Return only plan parts accepted by the provided schema.
|
|
45
55
|
|
|
46
|
-
${
|
|
56
|
+
${narrate ? NARRATION_RULES : ""}
|
|
57
|
+
|
|
58
|
+
${videoPlanInstruction(narrate)}`;
|
|
47
59
|
}
|
|
48
60
|
var DEFAULT_VIDEO_SYSTEM_PROMPT = createVideoSystemPrompt();
|
|
49
61
|
|
|
50
62
|
export {
|
|
63
|
+
videoPlanInstruction,
|
|
51
64
|
VIDEO_PLAN_INSTRUCTION,
|
|
52
65
|
createVideoSystemPrompt,
|
|
53
66
|
DEFAULT_VIDEO_SYSTEM_PROMPT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createVideoSystemPrompt
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-5SLENAJW.js";
|
|
4
4
|
import {
|
|
5
5
|
PACING_PLANNER_RULES
|
|
6
6
|
} from "./chunk-3O7OMMMF.js";
|
|
@@ -64,12 +64,19 @@ function needsPlannerSchema(schema) {
|
|
|
64
64
|
const visit = (property) => property.minimum != null || property.maximum != null || property.type === "object" || property.items != null && visit(property.items);
|
|
65
65
|
return Object.values(schema.properties).some(visit);
|
|
66
66
|
}
|
|
67
|
+
function isMediaProperty(property) {
|
|
68
|
+
return property?.format === "uri" || property?.format === "supplied-image" || property?.format === "stock-media-keyword";
|
|
69
|
+
}
|
|
70
|
+
function requiresAvailableMedia(template) {
|
|
71
|
+
const gates = getTemplateSchemaGates(template.schema);
|
|
72
|
+
return (template.schema.required ?? []).some((name) => isMediaProperty(template.schema.properties[name])) || gates.requiredAnyOf.some((group) => group.every((name) => isMediaProperty(template.schema.properties[name])));
|
|
73
|
+
}
|
|
67
74
|
var COMMON_MEDIA_VARIABLES = {
|
|
68
75
|
mediaUrl: "media",
|
|
69
76
|
mediaType: "enum(auto|photo|video|gradient)",
|
|
70
77
|
mediaPoster: "media",
|
|
71
78
|
mediaPosition: "enum(center|top|bottom|left|right)",
|
|
72
|
-
mediaTreatment: "enum(subtle|cinematic|text-safe)"
|
|
79
|
+
mediaTreatment: "enum(none|subtle|cinematic|text-safe)"
|
|
73
80
|
};
|
|
74
81
|
function plannerCatalog(templates, mediaResolverAvailable) {
|
|
75
82
|
return templates.map((template) => {
|
|
@@ -103,12 +110,15 @@ function plannerCatalog(templates, mediaResolverAvailable) {
|
|
|
103
110
|
});
|
|
104
111
|
}
|
|
105
112
|
function createTemplateSystemPrompt(options) {
|
|
106
|
-
const templates = options.kit.listTemplateMetadata();
|
|
113
|
+
const templates = options.kit.listTemplateMetadata().filter((template) => !requiresAvailableMedia(template) || options.suppliedMediaAvailable === true || options.mediaResolverAvailable === true && getStandardMediaResolverContract(template.schema) != null);
|
|
107
114
|
const resolverMediaAvailable = options.mediaResolverAvailable === true && templates.some(({ schema }) => getStandardMediaResolverContract(schema) != null);
|
|
108
115
|
const ids = new Set(templates.map(({ id }) => id));
|
|
109
116
|
const fields = new Set(templates.flatMap(({ schema }) => Object.keys(schema.properties)));
|
|
110
|
-
const basePrompt = createVideoSystemPrompt(options.knowledgeMode).split("\n").filter(
|
|
111
|
-
(line) => !line.includes("Never use media, ctaMedia, or reaction as the first generated body template") &&
|
|
117
|
+
const basePrompt = createVideoSystemPrompt(options.knowledgeMode, options.narrate === true).split("\n").filter(
|
|
118
|
+
(line) => !line.includes("Never use media, ctaMedia, or reaction as the first generated body template") && // The rule that keeps the opening beat asset-free belongs to the same
|
|
119
|
+
// pair as the one below it: both exist so playback can start without
|
|
120
|
+
// waiting on a provider, and both go when the host owns that wait.
|
|
121
|
+
!(options.mediaOnFirstScene === true && line.includes("The first generated body scene must be asset-free")) && !(resolverMediaAvailable && line.includes("Never expose a loading placeholder or unresolved media keyword"))
|
|
112
122
|
).join("\n");
|
|
113
123
|
const factRules = [
|
|
114
124
|
...ids.has("cardList") ? ["cardList needs two or three unused parallel facts"] : [],
|
|
@@ -139,12 +149,18 @@ ${options.basePrompt.trim()}` : void 0,
|
|
|
139
149
|
terminalPayoffs.length > 0 ? `When the input has no clear grounded action, never invent one and do not use jobs:[ask]. End with a grounded payoff using ${terminalPayoffNames}. Its concise 6\u201312 words of declarative copy must answer the story's so-what without repeating hook or setup language. Use media for an honest visual payoff, emojiBurst for playful delight, and confetti only for a real celebration, win, or milestone.` : void 0,
|
|
140
150
|
"requiresQuote is a hard gate: use those templates only for exact quoted words and attribution present in raw input. Never turn a role, relationship, or summary into speech. requiresScreenshot likewise needs an actual supplied screenshot URL.",
|
|
141
151
|
templates.some(({ schema }) => (schema["x-vanillasky"]?.requiredAnyOf?.length ?? 0) > 0) ? "requiredAnyOf is a hard presence gate: satisfy every listed group with at least one non-empty value." : void 0,
|
|
142
|
-
mediaTemplates.length > 0 ? `For streaming startup, ${mediaTemplateNames} ${mediaTemplates.length === 1 ? "is" : "are"} forbidden as the first generated body template, even when mediaType is gradient. Start with a content-fit non-media template.` : void 0,
|
|
152
|
+
mediaTemplates.length > 0 && options.mediaOnFirstScene !== true ? `For streaming startup, ${mediaTemplateNames} ${mediaTemplates.length === 1 ? "is" : "are"} forbidden as the first generated body template, even when mediaType is gradient. Start with a content-fit non-media template.` : void 0,
|
|
143
153
|
listFields.length > 0 ? `For list variables (${listFields.join(", ")}), emit actual JSON arrays. Keep list labels to 1\u20133 words. Keep step labels to 1\u20132 words and at most 18 characters. Do not use pipes or newlines as list delimiters.` : void 0,
|
|
144
154
|
fields.has("bars") ? 'For bars, emit an actual JSON array of 2\u20136 grounded objects with "label" and "value" fields. Use comparable units and avoid a largest-to-smallest positive ratio above 20. Do not encode bars as a string.' : void 0,
|
|
145
|
-
resolverMediaAvailable ?
|
|
155
|
+
resolverMediaAvailable ? `Prefer a relevant resolved image or video background on ${options.mediaOnFirstScene === true ? "every media-capable scene, the first included," : "later media-capable scenes"} whenever the permitted factual basis names a concrete person, place, product context, activity, or outcome that can be depicted honestly. Emit mediaKeyword on scene.add as a specific 2\u20138 word semantic query of at most 80 characters. The host removes mediaKeyword before the complete scene reaches the browser and replaces it with an approved asset. Use mediaType=gradient for abstract, sensitive, unsafe, or visually ambiguous material. Never emit or invent mediaUrl or mediaPoster.` : mediaTemplates.length > 0 ? `Use exact grounded values for required fields. mediaUrl must come verbatim from supplied input. Stock queries are not available. Do not select ${mediaTemplateNames} without a supplied mediaUrl; if another template has no mediaUrl, explicitly use mediaType=gradient. mediaType auto detects a URL, while gradient deliberately uses no external asset.` : "Use exact grounded values for required fields.",
|
|
146
156
|
"Catalog guidance describes composition; it is not a factual source and must never replace the permitted factual basis.",
|
|
147
|
-
JSON.stringify(plannerCatalog(templates, resolverMediaAvailable))
|
|
157
|
+
JSON.stringify(plannerCatalog(templates, resolverMediaAvailable)),
|
|
158
|
+
// Last, because the catalogue is thousands of tokens of per-scene field
|
|
159
|
+
// lists and it is what the model matches when it emits a scene. The wire
|
|
160
|
+
// format above says narration belongs there; said only above, a third of
|
|
161
|
+
// the way through, it loses to the schema the model has just finished
|
|
162
|
+
// reading, and every scene comes back silent.
|
|
163
|
+
options.narrate === true ? '\nThe catalog lists variables only. Every scene.add also carries "narration" beside "variables" and "timing", as specified in the wire format above. A scene without it is incomplete.' : void 0
|
|
148
164
|
].filter((line) => line != null).join("\n");
|
|
149
165
|
}
|
|
150
166
|
|
|
@@ -1,29 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseVideoEvent
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MMUXVA47.js";
|
|
4
|
+
import {
|
|
5
|
+
checksumVideo,
|
|
6
|
+
stableJson
|
|
7
|
+
} from "./chunk-2PYO6VAC.js";
|
|
4
8
|
import {
|
|
5
9
|
VIDEO_SCHEMA_VERSION
|
|
6
10
|
} from "./chunk-AOWSXU2K.js";
|
|
7
11
|
|
|
8
|
-
// src/protocol/stable-json.ts
|
|
9
|
-
function stableJson(value) {
|
|
10
|
-
if (value == null || typeof value !== "object") return JSON.stringify(value);
|
|
11
|
-
if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
|
|
12
|
-
const entries = Object.entries(value).filter(([, child]) => child !== void 0).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
|
|
13
|
-
return `{${entries.map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// src/protocol/checksum.ts
|
|
17
|
-
function checksumVideo(config) {
|
|
18
|
-
const input = stableJson(config);
|
|
19
|
-
let hash = 2166136261;
|
|
20
|
-
for (let index = 0; index < input.length; index += 1) {
|
|
21
|
-
hash ^= input.charCodeAt(index);
|
|
22
|
-
hash = Math.imul(hash, 16777619) >>> 0;
|
|
23
|
-
}
|
|
24
|
-
return `fnv1a32:${hash.toString(16).padStart(8, "0")}`;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
12
|
// src/protocol/state.ts
|
|
28
13
|
function createVideoState() {
|
|
29
14
|
return {
|
|
@@ -188,7 +173,6 @@ function createReplayableStream(source, onError) {
|
|
|
188
173
|
}
|
|
189
174
|
|
|
190
175
|
export {
|
|
191
|
-
checksumVideo,
|
|
192
176
|
createVideoState,
|
|
193
177
|
applyVideoEvent,
|
|
194
178
|
createReplayableStream
|
|
@@ -79,8 +79,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
79
79
|
"mediaTreatment": {
|
|
80
80
|
"type": "string",
|
|
81
81
|
"title": "Background contrast treatment",
|
|
82
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
82
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
83
83
|
"enum": [
|
|
84
|
+
"none",
|
|
84
85
|
"subtle",
|
|
85
86
|
"cinematic",
|
|
86
87
|
"text-safe"
|
|
@@ -431,8 +432,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
431
432
|
"mediaTreatment": {
|
|
432
433
|
"type": "string",
|
|
433
434
|
"title": "Background contrast treatment",
|
|
434
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
435
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
435
436
|
"enum": [
|
|
437
|
+
"none",
|
|
436
438
|
"subtle",
|
|
437
439
|
"cinematic",
|
|
438
440
|
"text-safe"
|
|
@@ -487,7 +489,8 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
487
489
|
"type": "string",
|
|
488
490
|
"title": "Text",
|
|
489
491
|
"description": "Title text shown above the chart",
|
|
490
|
-
"default": "Revenue up 300%."
|
|
492
|
+
"default": "Revenue up 300%.",
|
|
493
|
+
"maxLength": 48
|
|
491
494
|
},
|
|
492
495
|
"bars": {
|
|
493
496
|
"type": "array",
|
|
@@ -600,8 +603,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
600
603
|
"mediaTreatment": {
|
|
601
604
|
"type": "string",
|
|
602
605
|
"title": "Background contrast treatment",
|
|
603
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
606
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
604
607
|
"enum": [
|
|
608
|
+
"none",
|
|
605
609
|
"subtle",
|
|
606
610
|
"cinematic",
|
|
607
611
|
"text-safe"
|
|
@@ -733,8 +737,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
733
737
|
"mediaTreatment": {
|
|
734
738
|
"type": "string",
|
|
735
739
|
"title": "Background contrast treatment",
|
|
736
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
740
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
737
741
|
"enum": [
|
|
742
|
+
"none",
|
|
738
743
|
"subtle",
|
|
739
744
|
"cinematic",
|
|
740
745
|
"text-safe"
|
|
@@ -911,8 +916,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
911
916
|
"mediaTreatment": {
|
|
912
917
|
"type": "string",
|
|
913
918
|
"title": "Background contrast treatment",
|
|
914
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
919
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
915
920
|
"enum": [
|
|
921
|
+
"none",
|
|
916
922
|
"subtle",
|
|
917
923
|
"cinematic",
|
|
918
924
|
"text-safe"
|
|
@@ -1102,8 +1108,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1102
1108
|
"mediaTreatment": {
|
|
1103
1109
|
"type": "string",
|
|
1104
1110
|
"title": "Background contrast treatment",
|
|
1105
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1111
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1106
1112
|
"enum": [
|
|
1113
|
+
"none",
|
|
1107
1114
|
"subtle",
|
|
1108
1115
|
"cinematic",
|
|
1109
1116
|
"text-safe"
|
|
@@ -1218,8 +1225,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1218
1225
|
"mediaTreatment": {
|
|
1219
1226
|
"type": "string",
|
|
1220
1227
|
"title": "Background contrast treatment",
|
|
1221
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1228
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1222
1229
|
"enum": [
|
|
1230
|
+
"none",
|
|
1223
1231
|
"subtle",
|
|
1224
1232
|
"cinematic",
|
|
1225
1233
|
"text-safe"
|
|
@@ -1282,7 +1290,7 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1282
1290
|
"description": "Command typed character by character. Keep the meaningful invocation within 80 characters; the terminal deliberately ellipsizes longer display lines.",
|
|
1283
1291
|
"minLength": 1,
|
|
1284
1292
|
"maxLength": 80,
|
|
1285
|
-
"default": "npx vanillasky check"
|
|
1293
|
+
"default": "npx vanillasky templates check"
|
|
1286
1294
|
},
|
|
1287
1295
|
"output": {
|
|
1288
1296
|
"type": "array",
|
|
@@ -1359,8 +1367,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1359
1367
|
"mediaTreatment": {
|
|
1360
1368
|
"type": "string",
|
|
1361
1369
|
"title": "Background contrast treatment",
|
|
1362
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1370
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1363
1371
|
"enum": [
|
|
1372
|
+
"none",
|
|
1364
1373
|
"subtle",
|
|
1365
1374
|
"cinematic",
|
|
1366
1375
|
"text-safe"
|
|
@@ -1505,8 +1514,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1505
1514
|
"mediaTreatment": {
|
|
1506
1515
|
"type": "string",
|
|
1507
1516
|
"title": "Background contrast treatment",
|
|
1508
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1517
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1509
1518
|
"enum": [
|
|
1519
|
+
"none",
|
|
1510
1520
|
"subtle",
|
|
1511
1521
|
"cinematic",
|
|
1512
1522
|
"text-safe"
|
|
@@ -1629,8 +1639,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1629
1639
|
"mediaTreatment": {
|
|
1630
1640
|
"type": "string",
|
|
1631
1641
|
"title": "Background contrast treatment",
|
|
1632
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1642
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1633
1643
|
"enum": [
|
|
1644
|
+
"none",
|
|
1634
1645
|
"subtle",
|
|
1635
1646
|
"cinematic",
|
|
1636
1647
|
"text-safe"
|
|
@@ -1951,8 +1962,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
1951
1962
|
"mediaTreatment": {
|
|
1952
1963
|
"type": "string",
|
|
1953
1964
|
"title": "Background contrast treatment",
|
|
1954
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1965
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
1955
1966
|
"enum": [
|
|
1967
|
+
"none",
|
|
1956
1968
|
"subtle",
|
|
1957
1969
|
"cinematic",
|
|
1958
1970
|
"text-safe"
|
|
@@ -2125,8 +2137,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2125
2137
|
"mediaTreatment": {
|
|
2126
2138
|
"type": "string",
|
|
2127
2139
|
"title": "Background contrast treatment",
|
|
2128
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2140
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2129
2141
|
"enum": [
|
|
2142
|
+
"none",
|
|
2130
2143
|
"subtle",
|
|
2131
2144
|
"cinematic",
|
|
2132
2145
|
"text-safe"
|
|
@@ -2247,8 +2260,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2247
2260
|
"mediaTreatment": {
|
|
2248
2261
|
"type": "string",
|
|
2249
2262
|
"title": "Background contrast treatment",
|
|
2250
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2263
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2251
2264
|
"enum": [
|
|
2265
|
+
"none",
|
|
2252
2266
|
"subtle",
|
|
2253
2267
|
"cinematic",
|
|
2254
2268
|
"text-safe"
|
|
@@ -2373,8 +2387,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2373
2387
|
"mediaTreatment": {
|
|
2374
2388
|
"type": "string",
|
|
2375
2389
|
"title": "Background contrast treatment",
|
|
2376
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2390
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2377
2391
|
"enum": [
|
|
2392
|
+
"none",
|
|
2378
2393
|
"subtle",
|
|
2379
2394
|
"cinematic",
|
|
2380
2395
|
"text-safe"
|
|
@@ -2473,8 +2488,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2473
2488
|
"mediaTreatment": {
|
|
2474
2489
|
"type": "string",
|
|
2475
2490
|
"title": "Background contrast treatment",
|
|
2476
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2491
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2477
2492
|
"enum": [
|
|
2493
|
+
"none",
|
|
2478
2494
|
"subtle",
|
|
2479
2495
|
"cinematic",
|
|
2480
2496
|
"text-safe"
|
|
@@ -2575,8 +2591,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2575
2591
|
"mediaTreatment": {
|
|
2576
2592
|
"type": "string",
|
|
2577
2593
|
"title": "Background contrast treatment",
|
|
2578
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2594
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2579
2595
|
"enum": [
|
|
2596
|
+
"none",
|
|
2580
2597
|
"subtle",
|
|
2581
2598
|
"cinematic",
|
|
2582
2599
|
"text-safe"
|
|
@@ -2845,8 +2862,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2845
2862
|
"mediaTreatment": {
|
|
2846
2863
|
"type": "string",
|
|
2847
2864
|
"title": "Background contrast treatment",
|
|
2848
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2865
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2849
2866
|
"enum": [
|
|
2867
|
+
"none",
|
|
2850
2868
|
"subtle",
|
|
2851
2869
|
"cinematic",
|
|
2852
2870
|
"text-safe"
|
|
@@ -2975,8 +2993,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
2975
2993
|
"mediaTreatment": {
|
|
2976
2994
|
"type": "string",
|
|
2977
2995
|
"title": "Background contrast treatment",
|
|
2978
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2996
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
2979
2997
|
"enum": [
|
|
2998
|
+
"none",
|
|
2980
2999
|
"subtle",
|
|
2981
3000
|
"cinematic",
|
|
2982
3001
|
"text-safe"
|
|
@@ -3029,7 +3048,8 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3029
3048
|
"type": "string",
|
|
3030
3049
|
"title": "Text",
|
|
3031
3050
|
"description": "Title text",
|
|
3032
|
-
"default": "What you get."
|
|
3051
|
+
"default": "What you get.",
|
|
3052
|
+
"maxLength": 48
|
|
3033
3053
|
},
|
|
3034
3054
|
"items": {
|
|
3035
3055
|
"type": "array",
|
|
@@ -3112,8 +3132,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3112
3132
|
"mediaTreatment": {
|
|
3113
3133
|
"type": "string",
|
|
3114
3134
|
"title": "Background contrast treatment",
|
|
3115
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3135
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3116
3136
|
"enum": [
|
|
3137
|
+
"none",
|
|
3117
3138
|
"subtle",
|
|
3118
3139
|
"cinematic",
|
|
3119
3140
|
"text-safe"
|
|
@@ -3166,7 +3187,8 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3166
3187
|
"type": "string",
|
|
3167
3188
|
"title": "Text",
|
|
3168
3189
|
"description": "Title text",
|
|
3169
|
-
"default": "How it works."
|
|
3190
|
+
"default": "How it works.",
|
|
3191
|
+
"maxLength": 48
|
|
3170
3192
|
},
|
|
3171
3193
|
"steps": {
|
|
3172
3194
|
"type": "array",
|
|
@@ -3249,8 +3271,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3249
3271
|
"mediaTreatment": {
|
|
3250
3272
|
"type": "string",
|
|
3251
3273
|
"title": "Background contrast treatment",
|
|
3252
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3274
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3253
3275
|
"enum": [
|
|
3276
|
+
"none",
|
|
3254
3277
|
"subtle",
|
|
3255
3278
|
"cinematic",
|
|
3256
3279
|
"text-safe"
|
|
@@ -3361,8 +3384,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3361
3384
|
"mediaTreatment": {
|
|
3362
3385
|
"type": "string",
|
|
3363
3386
|
"title": "Background contrast treatment",
|
|
3364
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3387
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3365
3388
|
"enum": [
|
|
3389
|
+
"none",
|
|
3366
3390
|
"subtle",
|
|
3367
3391
|
"cinematic",
|
|
3368
3392
|
"text-safe"
|
|
@@ -3482,8 +3506,9 @@ var GENERATED_BUILTIN_TEMPLATE_CATALOG = [
|
|
|
3482
3506
|
"mediaTreatment": {
|
|
3483
3507
|
"type": "string",
|
|
3484
3508
|
"title": "Background contrast treatment",
|
|
3485
|
-
"description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3509
|
+
"description": "none leaves the picture untouched, for a scene carrying no type; subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
|
|
3486
3510
|
"enum": [
|
|
3511
|
+
"none",
|
|
3487
3512
|
"subtle",
|
|
3488
3513
|
"cinematic",
|
|
3489
3514
|
"text-safe"
|