@vanillaskyai/video 0.4.1 → 0.5.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/PUBLIC-API.md +12 -5
  3. package/README.md +14 -17
  4. package/dist/{builtin-server-BRTZN4Q7.js → builtin-server-YHEZ2JRF.js} +2 -2
  5. package/dist/check-runtime.js +1 -1
  6. package/dist/{chunk-BKF3A357.js → chunk-34O5BY6X.js} +1 -1
  7. package/dist/{chunk-LHFADNWJ.js → chunk-3ROGEU5A.js} +179 -342
  8. package/dist/{chunk-XAMUOSX7.js → chunk-3RV4YKB3.js} +0 -1
  9. package/dist/{chunk-GHJEAP4O.js → chunk-66MNRUCR.js} +1 -1
  10. package/dist/{chunk-EE6PK6XC.js → chunk-AOWSXU2K.js} +1 -1
  11. package/dist/{chunk-GR4I3MN2.js → chunk-EFL34TXF.js} +3 -3
  12. package/dist/{chunk-I5YWVQ5R.js → chunk-FVTMYS6U.js} +1 -1
  13. package/dist/{chunk-STIFILQG.js → chunk-FZHMQFG3.js} +46 -38
  14. package/dist/{chunk-JW47XCRL.js → chunk-G66Z5CWR.js} +30 -72
  15. package/dist/{chunk-RBQN3VSY.js → chunk-HVCPEAQF.js} +83 -1265
  16. package/dist/{chunk-N3KUA7VP.js → chunk-K6YVQODK.js} +4 -1
  17. package/dist/{chunk-WHPZED7X.js → chunk-PNS52FL4.js} +2 -5
  18. package/dist/{chunk-S5ZU5WUU.js → chunk-ZQQQAAKP.js} +2 -2
  19. package/dist/cli.js +20 -14
  20. package/dist/compose-video-QJHKTOQ7.js +13 -0
  21. package/dist/{events-D_1F6gw5.d.ts → events-BBP30j3c.d.ts} +3 -14
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +2 -2
  24. package/dist/{kit-DLeCr3d0.d.ts → kit-DEG3fcaL.d.ts} +1 -1
  25. package/dist/react.d.ts +6 -5
  26. package/dist/react.js +999 -348
  27. package/dist/server.d.ts +3 -3
  28. package/dist/server.js +18 -79
  29. package/dist/{system-prompt-NMYHLAMJ.js → system-prompt-4I6Z5HK3.js} +1 -1
  30. package/dist/template-catalog.js +1 -1
  31. package/dist/templates.d.ts +3 -3
  32. package/dist/templates.js +87 -4
  33. package/dist/test.d.ts +3 -27
  34. package/dist/test.js +3 -3
  35. package/dist/{text-stream-UPGUD2TD.js → text-stream-J6EDDJP4.js} +3 -3
  36. package/dist/{types-Cg0Onj7l.d.ts → types-BV9IqExh.d.ts} +1 -16
  37. package/docs/agent-integration.md +4 -3
  38. package/docs/concepts.md +4 -4
  39. package/docs/custom-templates.md +2 -2
  40. package/docs/getting-started.md +13 -18
  41. package/docs/integrate-nextjs.md +12 -8
  42. package/docs/persistence.md +1 -1
  43. package/docs/prompt-and-input.md +2 -2
  44. package/docs/reference/protocol.md +9 -12
  45. package/docs/reference/provider-adapters.md +5 -5
  46. package/docs/testing.md +1 -1
  47. package/examples/nextjs-quickstart/.env.example +2 -2
  48. package/examples/nextjs-quickstart/README.md +4 -1
  49. package/examples/nextjs-quickstart/package.json +4 -4
  50. package/examples/nextjs-quickstart/src/app/api/video/route.ts +4 -2
  51. package/package.json +8 -8
  52. package/dist/chunk-CR7FE7BW.js +0 -109
  53. package/dist/compose-video-6UQ33DOO.js +0 -13
@@ -1,4 +1,51 @@
1
1
  // src/visual-system/scene-templates/schemas.ts
2
+ function createBackgroundMediaSchemaProperties(options = {}) {
3
+ const mediaKeyword = {
4
+ type: "string",
5
+ title: "Background search keyword",
6
+ description: "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
7
+ ...options.stockMediaKeyword === false ? {} : { format: "stock-media-keyword" },
8
+ default: ""
9
+ };
10
+ return {
11
+ mediaUrl: {
12
+ type: "string",
13
+ title: "Background media",
14
+ description: "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
15
+ format: "uri",
16
+ default: ""
17
+ },
18
+ mediaKeyword,
19
+ mediaType: {
20
+ type: "string",
21
+ title: "Background media type",
22
+ description: "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
23
+ enum: ["auto", "photo", "video", "gradient"],
24
+ default: "auto"
25
+ },
26
+ mediaPoster: {
27
+ type: "string",
28
+ title: "Background poster image",
29
+ description: "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
30
+ format: "uri",
31
+ default: ""
32
+ },
33
+ mediaPosition: {
34
+ type: "string",
35
+ title: "Background focal position",
36
+ description: "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
37
+ enum: ["center", "top", "bottom", "left", "right"],
38
+ default: "center"
39
+ },
40
+ mediaTreatment: {
41
+ type: "string",
42
+ title: "Background contrast treatment",
43
+ description: "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
44
+ enum: ["subtle", "cinematic", "text-safe"],
45
+ default: "cinematic"
46
+ }
47
+ };
48
+ }
2
49
  var BUILTIN_TEMPLATE_SCHEMAS = {
3
50
  "media": {
4
51
  "type": "object",
@@ -9,63 +56,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
9
56
  "description": "Title text shown on the scene",
10
57
  "default": "Make an impact."
11
58
  },
12
- "mediaUrl": {
13
- "type": "string",
14
- "title": "Background media",
15
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
16
- "format": "uri",
17
- "default": ""
18
- },
19
- "mediaKeyword": {
20
- "type": "string",
21
- "title": "Background search keyword",
22
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
23
- "format": "stock-media-keyword",
24
- "default": ""
25
- },
26
- "mediaType": {
27
- "type": "string",
28
- "title": "Background media type",
29
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
30
- "enum": [
31
- "auto",
32
- "photo",
33
- "video",
34
- "gradient"
35
- ],
36
- "default": "auto"
37
- },
38
- "mediaPoster": {
39
- "type": "string",
40
- "title": "Background poster image",
41
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
42
- "format": "uri",
43
- "default": ""
44
- },
45
- "mediaPosition": {
46
- "type": "string",
47
- "title": "Background focal position",
48
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
49
- "enum": [
50
- "center",
51
- "top",
52
- "bottom",
53
- "left",
54
- "right"
55
- ],
56
- "default": "center"
57
- },
58
- "mediaTreatment": {
59
- "type": "string",
60
- "title": "Background contrast treatment",
61
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
62
- "enum": [
63
- "subtle",
64
- "cinematic",
65
- "text-safe"
66
- ],
67
- "default": "cinematic"
68
- },
59
+ ...createBackgroundMediaSchemaProperties(),
69
60
  "confetti": {
70
61
  "type": "boolean",
71
62
  "title": "Confetti",
@@ -243,63 +234,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
243
234
  "maxLength": 4,
244
235
  "default": ""
245
236
  },
246
- "mediaUrl": {
247
- "type": "string",
248
- "title": "Background media",
249
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
250
- "format": "uri",
251
- "default": ""
252
- },
253
- "mediaKeyword": {
254
- "type": "string",
255
- "title": "Background search keyword",
256
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
257
- "format": "stock-media-keyword",
258
- "default": ""
259
- },
260
- "mediaType": {
261
- "type": "string",
262
- "title": "Background media type",
263
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
264
- "enum": [
265
- "auto",
266
- "photo",
267
- "video",
268
- "gradient"
269
- ],
270
- "default": "auto"
271
- },
272
- "mediaPoster": {
273
- "type": "string",
274
- "title": "Background poster image",
275
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
276
- "format": "uri",
277
- "default": ""
278
- },
279
- "mediaPosition": {
280
- "type": "string",
281
- "title": "Background focal position",
282
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
283
- "enum": [
284
- "center",
285
- "top",
286
- "bottom",
287
- "left",
288
- "right"
289
- ],
290
- "default": "center"
291
- },
292
- "mediaTreatment": {
293
- "type": "string",
294
- "title": "Background contrast treatment",
295
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
296
- "enum": [
297
- "subtle",
298
- "cinematic",
299
- "text-safe"
300
- ],
301
- "default": "cinematic"
302
- }
237
+ ...createBackgroundMediaSchemaProperties()
303
238
  },
304
239
  "required": [
305
240
  "texts",
@@ -359,63 +294,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
359
294
  { "label": "Q4", "value": 91 }
360
295
  ]
361
296
  },
362
- "mediaUrl": {
363
- "type": "string",
364
- "title": "Background media",
365
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
366
- "format": "uri",
367
- "default": ""
368
- },
369
- "mediaKeyword": {
370
- "type": "string",
371
- "title": "Background search keyword",
372
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
373
- "format": "stock-media-keyword",
374
- "default": ""
375
- },
376
- "mediaType": {
377
- "type": "string",
378
- "title": "Background media type",
379
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
380
- "enum": [
381
- "auto",
382
- "photo",
383
- "video",
384
- "gradient"
385
- ],
386
- "default": "auto"
387
- },
388
- "mediaPoster": {
389
- "type": "string",
390
- "title": "Background poster image",
391
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
392
- "format": "uri",
393
- "default": ""
394
- },
395
- "mediaPosition": {
396
- "type": "string",
397
- "title": "Background focal position",
398
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
399
- "enum": [
400
- "center",
401
- "top",
402
- "bottom",
403
- "left",
404
- "right"
405
- ],
406
- "default": "center"
407
- },
408
- "mediaTreatment": {
409
- "type": "string",
410
- "title": "Background contrast treatment",
411
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
412
- "enum": [
413
- "subtle",
414
- "cinematic",
415
- "text-safe"
416
- ],
417
- "default": "cinematic"
418
- }
297
+ ...createBackgroundMediaSchemaProperties()
419
298
  },
420
299
  "required": [
421
300
  "texts",
@@ -464,63 +343,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
464
343
  "maxLength": 3,
465
344
  "default": "%"
466
345
  },
467
- "mediaUrl": {
468
- "type": "string",
469
- "title": "Background media",
470
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
471
- "format": "uri",
472
- "default": ""
473
- },
474
- "mediaKeyword": {
475
- "type": "string",
476
- "title": "Background search keyword",
477
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
478
- "format": "stock-media-keyword",
479
- "default": ""
480
- },
481
- "mediaType": {
482
- "type": "string",
483
- "title": "Background media type",
484
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
485
- "enum": [
486
- "auto",
487
- "photo",
488
- "video",
489
- "gradient"
490
- ],
491
- "default": "auto"
492
- },
493
- "mediaPoster": {
494
- "type": "string",
495
- "title": "Background poster image",
496
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
497
- "format": "uri",
498
- "default": ""
499
- },
500
- "mediaPosition": {
501
- "type": "string",
502
- "title": "Background focal position",
503
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
504
- "enum": [
505
- "center",
506
- "top",
507
- "bottom",
508
- "left",
509
- "right"
510
- ],
511
- "default": "center"
512
- },
513
- "mediaTreatment": {
514
- "type": "string",
515
- "title": "Background contrast treatment",
516
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
517
- "enum": [
518
- "subtle",
519
- "cinematic",
520
- "text-safe"
521
- ],
522
- "default": "cinematic"
523
- }
346
+ ...createBackgroundMediaSchemaProperties()
524
347
  },
525
348
  "required": [
526
349
  "texts",
@@ -614,62 +437,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
614
437
  "description": "Vertical percentage of the product surface for the callout anchor.",
615
438
  "default": 35
616
439
  },
617
- "mediaUrl": {
618
- "type": "string",
619
- "title": "Background media",
620
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
621
- "format": "uri",
622
- "default": ""
623
- },
624
- "mediaKeyword": {
625
- "type": "string",
626
- "title": "Background search keyword",
627
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
628
- "default": ""
629
- },
630
- "mediaType": {
631
- "type": "string",
632
- "title": "Background media type",
633
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
634
- "enum": [
635
- "auto",
636
- "photo",
637
- "video",
638
- "gradient"
639
- ],
640
- "default": "auto"
641
- },
642
- "mediaPoster": {
643
- "type": "string",
644
- "title": "Background poster image",
645
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
646
- "format": "uri",
647
- "default": ""
648
- },
649
- "mediaPosition": {
650
- "type": "string",
651
- "title": "Background focal position",
652
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
653
- "enum": [
654
- "center",
655
- "top",
656
- "bottom",
657
- "left",
658
- "right"
659
- ],
660
- "default": "center"
661
- },
662
- "mediaTreatment": {
663
- "type": "string",
664
- "title": "Background contrast treatment",
665
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
666
- "enum": [
667
- "subtle",
668
- "cinematic",
669
- "text-safe"
670
- ],
671
- "default": "cinematic"
672
- }
440
+ ...createBackgroundMediaSchemaProperties({ stockMediaKeyword: false })
673
441
  },
674
442
  "required": [
675
443
  "texts"
@@ -776,62 +544,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
776
544
  ],
777
545
  "default": ""
778
546
  },
779
- "mediaUrl": {
780
- "type": "string",
781
- "title": "Background media",
782
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
783
- "format": "uri",
784
- "default": ""
785
- },
786
- "mediaKeyword": {
787
- "type": "string",
788
- "title": "Background search keyword",
789
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
790
- "default": ""
791
- },
792
- "mediaType": {
793
- "type": "string",
794
- "title": "Background media type",
795
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
796
- "enum": [
797
- "auto",
798
- "photo",
799
- "video",
800
- "gradient"
801
- ],
802
- "default": "auto"
803
- },
804
- "mediaPoster": {
805
- "type": "string",
806
- "title": "Background poster image",
807
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
808
- "format": "uri",
809
- "default": ""
810
- },
811
- "mediaPosition": {
812
- "type": "string",
813
- "title": "Background focal position",
814
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
815
- "enum": [
816
- "center",
817
- "top",
818
- "bottom",
819
- "left",
820
- "right"
821
- ],
822
- "default": "center"
823
- },
824
- "mediaTreatment": {
825
- "type": "string",
826
- "title": "Background contrast treatment",
827
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
828
- "enum": [
829
- "subtle",
830
- "cinematic",
831
- "text-safe"
832
- ],
833
- "default": "cinematic"
834
- }
547
+ ...createBackgroundMediaSchemaProperties({ stockMediaKeyword: false })
835
548
  },
836
549
  "required": [
837
550
  "texts"
@@ -862,63 +575,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
862
575
  "maxLength": 32,
863
576
  "default": "app.ts"
864
577
  },
865
- "mediaUrl": {
866
- "type": "string",
867
- "title": "Background media",
868
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
869
- "format": "uri",
870
- "default": ""
871
- },
872
- "mediaKeyword": {
873
- "type": "string",
874
- "title": "Background search keyword",
875
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
876
- "format": "stock-media-keyword",
877
- "default": ""
878
- },
879
- "mediaType": {
880
- "type": "string",
881
- "title": "Background media type",
882
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
883
- "enum": [
884
- "auto",
885
- "photo",
886
- "video",
887
- "gradient"
888
- ],
889
- "default": "auto"
890
- },
891
- "mediaPoster": {
892
- "type": "string",
893
- "title": "Background poster image",
894
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
895
- "format": "uri",
896
- "default": ""
897
- },
898
- "mediaPosition": {
899
- "type": "string",
900
- "title": "Background focal position",
901
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
902
- "enum": [
903
- "center",
904
- "top",
905
- "bottom",
906
- "left",
907
- "right"
908
- ],
909
- "default": "center"
910
- },
911
- "mediaTreatment": {
912
- "type": "string",
913
- "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.",
915
- "enum": [
916
- "subtle",
917
- "cinematic",
918
- "text-safe"
919
- ],
920
- "default": "cinematic"
921
- }
578
+ ...createBackgroundMediaSchemaProperties()
922
579
  },
923
580
  "required": [
924
581
  "texts",
@@ -974,63 +631,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
974
631
  "maxLength": 3,
975
632
  "default": "$"
976
633
  },
977
- "mediaUrl": {
978
- "type": "string",
979
- "title": "Background media",
980
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
981
- "format": "uri",
982
- "default": ""
983
- },
984
- "mediaKeyword": {
985
- "type": "string",
986
- "title": "Background search keyword",
987
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
988
- "format": "stock-media-keyword",
989
- "default": ""
990
- },
991
- "mediaType": {
992
- "type": "string",
993
- "title": "Background media type",
994
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
995
- "enum": [
996
- "auto",
997
- "photo",
998
- "video",
999
- "gradient"
1000
- ],
1001
- "default": "auto"
1002
- },
1003
- "mediaPoster": {
1004
- "type": "string",
1005
- "title": "Background poster image",
1006
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1007
- "format": "uri",
1008
- "default": ""
1009
- },
1010
- "mediaPosition": {
1011
- "type": "string",
1012
- "title": "Background focal position",
1013
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1014
- "enum": [
1015
- "center",
1016
- "top",
1017
- "bottom",
1018
- "left",
1019
- "right"
1020
- ],
1021
- "default": "center"
1022
- },
1023
- "mediaTreatment": {
1024
- "type": "string",
1025
- "title": "Background contrast treatment",
1026
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1027
- "enum": [
1028
- "subtle",
1029
- "cinematic",
1030
- "text-safe"
1031
- ],
1032
- "default": "cinematic"
1033
- }
634
+ ...createBackgroundMediaSchemaProperties()
1034
635
  },
1035
636
  "required": [
1036
637
  "texts",
@@ -1089,63 +690,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1089
690
  ],
1090
691
  "default": 0
1091
692
  },
1092
- "mediaUrl": {
1093
- "type": "string",
1094
- "title": "Background media",
1095
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1096
- "format": "uri",
1097
- "default": ""
1098
- },
1099
- "mediaKeyword": {
1100
- "type": "string",
1101
- "title": "Background search keyword",
1102
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1103
- "format": "stock-media-keyword",
1104
- "default": ""
1105
- },
1106
- "mediaType": {
1107
- "type": "string",
1108
- "title": "Background media type",
1109
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1110
- "enum": [
1111
- "auto",
1112
- "photo",
1113
- "video",
1114
- "gradient"
1115
- ],
1116
- "default": "auto"
1117
- },
1118
- "mediaPoster": {
1119
- "type": "string",
1120
- "title": "Background poster image",
1121
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1122
- "format": "uri",
1123
- "default": ""
1124
- },
1125
- "mediaPosition": {
1126
- "type": "string",
1127
- "title": "Background focal position",
1128
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1129
- "enum": [
1130
- "center",
1131
- "top",
1132
- "bottom",
1133
- "left",
1134
- "right"
1135
- ],
1136
- "default": "center"
1137
- },
1138
- "mediaTreatment": {
1139
- "type": "string",
1140
- "title": "Background contrast treatment",
1141
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1142
- "enum": [
1143
- "subtle",
1144
- "cinematic",
1145
- "text-safe"
1146
- ],
1147
- "default": "cinematic"
1148
- }
693
+ ...createBackgroundMediaSchemaProperties()
1149
694
  },
1150
695
  "required": [
1151
696
  "authorName",
@@ -1183,77 +728,21 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1183
728
  "maxLength": 100,
1184
729
  "default": "Believe in your dreams, they will lead you."
1185
730
  },
1186
- "mediaUrl": {
1187
- "type": "string",
1188
- "title": "Background media",
1189
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1190
- "format": "uri",
1191
- "default": ""
1192
- },
1193
- "mediaKeyword": {
1194
- "type": "string",
1195
- "title": "Background search keyword",
1196
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1197
- "format": "stock-media-keyword",
1198
- "default": ""
1199
- },
1200
- "mediaType": {
1201
- "type": "string",
1202
- "title": "Background media type",
1203
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1204
- "enum": [
1205
- "auto",
1206
- "photo",
1207
- "video",
1208
- "gradient"
1209
- ],
1210
- "default": "auto"
1211
- },
1212
- "mediaPoster": {
1213
- "type": "string",
1214
- "title": "Background poster image",
1215
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1216
- "format": "uri",
1217
- "default": ""
1218
- },
1219
- "mediaPosition": {
1220
- "type": "string",
1221
- "title": "Background focal position",
1222
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1223
- "enum": [
1224
- "center",
1225
- "top",
1226
- "bottom",
1227
- "left",
1228
- "right"
1229
- ],
1230
- "default": "center"
1231
- },
1232
- "mediaTreatment": {
1233
- "type": "string",
1234
- "title": "Background contrast treatment",
1235
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1236
- "enum": [
1237
- "subtle",
1238
- "cinematic",
1239
- "text-safe"
1240
- ],
1241
- "default": "cinematic"
1242
- }
1243
- },
1244
- "required": [
1245
- "appName",
1246
- "message"
1247
- ],
1248
- "additionalProperties": false,
1249
- "x-vanillasky": {
1250
- "allowsStockMedia": true
1251
- }
1252
- },
1253
- "chatMessenger": {
1254
- "type": "object",
1255
- "properties": {
1256
- "msg1": {
731
+ ...createBackgroundMediaSchemaProperties()
732
+ },
733
+ "required": [
734
+ "appName",
735
+ "message"
736
+ ],
737
+ "additionalProperties": false,
738
+ "x-vanillasky": {
739
+ "allowsStockMedia": true
740
+ }
741
+ },
742
+ "chatMessenger": {
743
+ "type": "object",
744
+ "properties": {
745
+ "msg1": {
1257
746
  "type": "string",
1258
747
  "title": "Message 1 (received)",
1259
748
  "description": "First message \u2014 left/received by default. Append |in or |out to override side. Aim for 3-4 messages total; use 5 with date chips only for a real time gap in a 10s+ scene.",
@@ -1421,63 +910,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1421
910
  "maxLength": 16,
1422
911
  "default": "\u{1F389}"
1423
912
  },
1424
- "mediaUrl": {
1425
- "type": "string",
1426
- "title": "Background media",
1427
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1428
- "format": "uri",
1429
- "default": ""
1430
- },
1431
- "mediaKeyword": {
1432
- "type": "string",
1433
- "title": "Background search keyword",
1434
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1435
- "format": "stock-media-keyword",
1436
- "default": ""
1437
- },
1438
- "mediaType": {
1439
- "type": "string",
1440
- "title": "Background media type",
1441
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1442
- "enum": [
1443
- "auto",
1444
- "photo",
1445
- "video",
1446
- "gradient"
1447
- ],
1448
- "default": "auto"
1449
- },
1450
- "mediaPoster": {
1451
- "type": "string",
1452
- "title": "Background poster image",
1453
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1454
- "format": "uri",
1455
- "default": ""
1456
- },
1457
- "mediaPosition": {
1458
- "type": "string",
1459
- "title": "Background focal position",
1460
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1461
- "enum": [
1462
- "center",
1463
- "top",
1464
- "bottom",
1465
- "left",
1466
- "right"
1467
- ],
1468
- "default": "center"
1469
- },
1470
- "mediaTreatment": {
1471
- "type": "string",
1472
- "title": "Background contrast treatment",
1473
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1474
- "enum": [
1475
- "subtle",
1476
- "cinematic",
1477
- "text-safe"
1478
- ],
1479
- "default": "cinematic"
1480
- }
913
+ ...createBackgroundMediaSchemaProperties()
1481
914
  },
1482
915
  "required": [
1483
916
  "label",
@@ -1570,63 +1003,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1570
1003
  ],
1571
1004
  "default": ""
1572
1005
  },
1573
- "mediaUrl": {
1574
- "type": "string",
1575
- "title": "Background media",
1576
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1577
- "format": "uri",
1578
- "default": ""
1579
- },
1580
- "mediaKeyword": {
1581
- "type": "string",
1582
- "title": "Background search keyword",
1583
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1584
- "format": "stock-media-keyword",
1585
- "default": ""
1586
- },
1587
- "mediaType": {
1588
- "type": "string",
1589
- "title": "Background media type",
1590
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1591
- "enum": [
1592
- "auto",
1593
- "photo",
1594
- "video",
1595
- "gradient"
1596
- ],
1597
- "default": "auto"
1598
- },
1599
- "mediaPoster": {
1600
- "type": "string",
1601
- "title": "Background poster image",
1602
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1603
- "format": "uri",
1604
- "default": ""
1605
- },
1606
- "mediaPosition": {
1607
- "type": "string",
1608
- "title": "Background focal position",
1609
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1610
- "enum": [
1611
- "center",
1612
- "top",
1613
- "bottom",
1614
- "left",
1615
- "right"
1616
- ],
1617
- "default": "center"
1618
- },
1619
- "mediaTreatment": {
1620
- "type": "string",
1621
- "title": "Background contrast treatment",
1622
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1623
- "enum": [
1624
- "subtle",
1625
- "cinematic",
1626
- "text-safe"
1627
- ],
1628
- "default": "cinematic"
1629
- }
1006
+ ...createBackgroundMediaSchemaProperties()
1630
1007
  },
1631
1008
  "required": [
1632
1009
  "review1Title",
@@ -1663,63 +1040,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1663
1040
  ],
1664
1041
  "default": ""
1665
1042
  },
1666
- "mediaUrl": {
1667
- "type": "string",
1668
- "title": "Background media",
1669
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1670
- "format": "uri",
1671
- "default": ""
1672
- },
1673
- "mediaKeyword": {
1674
- "type": "string",
1675
- "title": "Background search keyword",
1676
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1677
- "format": "stock-media-keyword",
1678
- "default": ""
1679
- },
1680
- "mediaType": {
1681
- "type": "string",
1682
- "title": "Background media type",
1683
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1684
- "enum": [
1685
- "auto",
1686
- "photo",
1687
- "video",
1688
- "gradient"
1689
- ],
1690
- "default": "auto"
1691
- },
1692
- "mediaPoster": {
1693
- "type": "string",
1694
- "title": "Background poster image",
1695
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1696
- "format": "uri",
1697
- "default": ""
1698
- },
1699
- "mediaPosition": {
1700
- "type": "string",
1701
- "title": "Background focal position",
1702
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1703
- "enum": [
1704
- "center",
1705
- "top",
1706
- "bottom",
1707
- "left",
1708
- "right"
1709
- ],
1710
- "default": "center"
1711
- },
1712
- "mediaTreatment": {
1713
- "type": "string",
1714
- "title": "Background contrast treatment",
1715
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1716
- "enum": [
1717
- "subtle",
1718
- "cinematic",
1719
- "text-safe"
1720
- ],
1721
- "default": "cinematic"
1722
- }
1043
+ ...createBackgroundMediaSchemaProperties()
1723
1044
  },
1724
1045
  "required": [
1725
1046
  "quote",
@@ -1762,63 +1083,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1762
1083
  "maxLength": 12,
1763
1084
  "default": "Accept"
1764
1085
  },
1765
- "mediaUrl": {
1766
- "type": "string",
1767
- "title": "Background media",
1768
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1769
- "format": "uri",
1770
- "default": ""
1771
- },
1772
- "mediaKeyword": {
1773
- "type": "string",
1774
- "title": "Background search keyword",
1775
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1776
- "format": "stock-media-keyword",
1777
- "default": ""
1778
- },
1779
- "mediaType": {
1780
- "type": "string",
1781
- "title": "Background media type",
1782
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1783
- "enum": [
1784
- "auto",
1785
- "photo",
1786
- "video",
1787
- "gradient"
1788
- ],
1789
- "default": "auto"
1790
- },
1791
- "mediaPoster": {
1792
- "type": "string",
1793
- "title": "Background poster image",
1794
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1795
- "format": "uri",
1796
- "default": ""
1797
- },
1798
- "mediaPosition": {
1799
- "type": "string",
1800
- "title": "Background focal position",
1801
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1802
- "enum": [
1803
- "center",
1804
- "top",
1805
- "bottom",
1806
- "left",
1807
- "right"
1808
- ],
1809
- "default": "center"
1810
- },
1811
- "mediaTreatment": {
1812
- "type": "string",
1813
- "title": "Background contrast treatment",
1814
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1815
- "enum": [
1816
- "subtle",
1817
- "cinematic",
1818
- "text-safe"
1819
- ],
1820
- "default": "cinematic"
1821
- }
1086
+ ...createBackgroundMediaSchemaProperties()
1822
1087
  },
1823
1088
  "required": [
1824
1089
  "callerName"
@@ -1837,63 +1102,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1837
1102
  "description": "The brand-voiced message rendered as a single iMessage-style outgoing bubble (right side, cream) over the media background. 4-12 words reads best \u2014 short messages produce a tight bubble; longer ones wrap inside the 75% width cap. Examples: 'We built this for you.', 'Thanks for being here.', 'See what's new this week.'",
1838
1103
  "default": "We built this for you."
1839
1104
  },
1840
- "mediaUrl": {
1841
- "type": "string",
1842
- "title": "Background media",
1843
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1844
- "format": "uri",
1845
- "default": ""
1846
- },
1847
- "mediaKeyword": {
1848
- "type": "string",
1849
- "title": "Background search keyword",
1850
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1851
- "format": "stock-media-keyword",
1852
- "default": ""
1853
- },
1854
- "mediaType": {
1855
- "type": "string",
1856
- "title": "Background media type",
1857
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1858
- "enum": [
1859
- "auto",
1860
- "photo",
1861
- "video",
1862
- "gradient"
1863
- ],
1864
- "default": "auto"
1865
- },
1866
- "mediaPoster": {
1867
- "type": "string",
1868
- "title": "Background poster image",
1869
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1870
- "format": "uri",
1871
- "default": ""
1872
- },
1873
- "mediaPosition": {
1874
- "type": "string",
1875
- "title": "Background focal position",
1876
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1877
- "enum": [
1878
- "center",
1879
- "top",
1880
- "bottom",
1881
- "left",
1882
- "right"
1883
- ],
1884
- "default": "center"
1885
- },
1886
- "mediaTreatment": {
1887
- "type": "string",
1888
- "title": "Background contrast treatment",
1889
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1890
- "enum": [
1891
- "subtle",
1892
- "cinematic",
1893
- "text-safe"
1894
- ],
1895
- "default": "cinematic"
1896
- }
1105
+ ...createBackgroundMediaSchemaProperties()
1897
1106
  },
1898
1107
  "required": [
1899
1108
  "message"
@@ -1914,63 +1123,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
1914
1123
  "maxLength": 40,
1915
1124
  "default": "Make a launch video for our app"
1916
1125
  },
1917
- "mediaUrl": {
1918
- "type": "string",
1919
- "title": "Background media",
1920
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
1921
- "format": "uri",
1922
- "default": ""
1923
- },
1924
- "mediaKeyword": {
1925
- "type": "string",
1926
- "title": "Background search keyword",
1927
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
1928
- "format": "stock-media-keyword",
1929
- "default": ""
1930
- },
1931
- "mediaType": {
1932
- "type": "string",
1933
- "title": "Background media type",
1934
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
1935
- "enum": [
1936
- "auto",
1937
- "photo",
1938
- "video",
1939
- "gradient"
1940
- ],
1941
- "default": "auto"
1942
- },
1943
- "mediaPoster": {
1944
- "type": "string",
1945
- "title": "Background poster image",
1946
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
1947
- "format": "uri",
1948
- "default": ""
1949
- },
1950
- "mediaPosition": {
1951
- "type": "string",
1952
- "title": "Background focal position",
1953
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
1954
- "enum": [
1955
- "center",
1956
- "top",
1957
- "bottom",
1958
- "left",
1959
- "right"
1960
- ],
1961
- "default": "center"
1962
- },
1963
- "mediaTreatment": {
1964
- "type": "string",
1965
- "title": "Background contrast treatment",
1966
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
1967
- "enum": [
1968
- "subtle",
1969
- "cinematic",
1970
- "text-safe"
1971
- ],
1972
- "default": "cinematic"
1973
- }
1126
+ ...createBackgroundMediaSchemaProperties()
1974
1127
  },
1975
1128
  "required": [
1976
1129
  "promptText"
@@ -2129,63 +1282,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2129
1282
  "maxLength": 24,
2130
1283
  "default": "Latency"
2131
1284
  },
2132
- "mediaUrl": {
2133
- "type": "string",
2134
- "title": "Background media",
2135
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2136
- "format": "uri",
2137
- "default": ""
2138
- },
2139
- "mediaKeyword": {
2140
- "type": "string",
2141
- "title": "Background search keyword",
2142
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2143
- "format": "stock-media-keyword",
2144
- "default": ""
2145
- },
2146
- "mediaType": {
2147
- "type": "string",
2148
- "title": "Background media type",
2149
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2150
- "enum": [
2151
- "auto",
2152
- "photo",
2153
- "video",
2154
- "gradient"
2155
- ],
2156
- "default": "auto"
2157
- },
2158
- "mediaPoster": {
2159
- "type": "string",
2160
- "title": "Background poster image",
2161
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2162
- "format": "uri",
2163
- "default": ""
2164
- },
2165
- "mediaPosition": {
2166
- "type": "string",
2167
- "title": "Background focal position",
2168
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2169
- "enum": [
2170
- "center",
2171
- "top",
2172
- "bottom",
2173
- "left",
2174
- "right"
2175
- ],
2176
- "default": "center"
2177
- },
2178
- "mediaTreatment": {
2179
- "type": "string",
2180
- "title": "Background contrast treatment",
2181
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2182
- "enum": [
2183
- "subtle",
2184
- "cinematic",
2185
- "text-safe"
2186
- ],
2187
- "default": "cinematic"
2188
- }
1285
+ ...createBackgroundMediaSchemaProperties()
2189
1286
  },
2190
1287
  "required": [
2191
1288
  "texts",
@@ -2231,63 +1328,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2231
1328
  "description": "The solution statement \u2014 your value prop in 1 sentence",
2232
1329
  "default": "AI that summarizes in seconds"
2233
1330
  },
2234
- "mediaUrl": {
2235
- "type": "string",
2236
- "title": "Background media",
2237
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2238
- "format": "uri",
2239
- "default": ""
2240
- },
2241
- "mediaKeyword": {
2242
- "type": "string",
2243
- "title": "Background search keyword",
2244
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2245
- "format": "stock-media-keyword",
2246
- "default": ""
2247
- },
2248
- "mediaType": {
2249
- "type": "string",
2250
- "title": "Background media type",
2251
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2252
- "enum": [
2253
- "auto",
2254
- "photo",
2255
- "video",
2256
- "gradient"
2257
- ],
2258
- "default": "auto"
2259
- },
2260
- "mediaPoster": {
2261
- "type": "string",
2262
- "title": "Background poster image",
2263
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2264
- "format": "uri",
2265
- "default": ""
2266
- },
2267
- "mediaPosition": {
2268
- "type": "string",
2269
- "title": "Background focal position",
2270
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2271
- "enum": [
2272
- "center",
2273
- "top",
2274
- "bottom",
2275
- "left",
2276
- "right"
2277
- ],
2278
- "default": "center"
2279
- },
2280
- "mediaTreatment": {
2281
- "type": "string",
2282
- "title": "Background contrast treatment",
2283
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2284
- "enum": [
2285
- "subtle",
2286
- "cinematic",
2287
- "text-safe"
2288
- ],
2289
- "default": "cinematic"
2290
- }
1331
+ ...createBackgroundMediaSchemaProperties()
2291
1332
  },
2292
1333
  "required": [
2293
1334
  "problemText",
@@ -2339,63 +1380,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2339
1380
  "maxItems": 3,
2340
1381
  "default": []
2341
1382
  },
2342
- "mediaUrl": {
2343
- "type": "string",
2344
- "title": "Background media",
2345
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2346
- "format": "uri",
2347
- "default": ""
2348
- },
2349
- "mediaKeyword": {
2350
- "type": "string",
2351
- "title": "Background search keyword",
2352
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2353
- "format": "stock-media-keyword",
2354
- "default": ""
2355
- },
2356
- "mediaType": {
2357
- "type": "string",
2358
- "title": "Background media type",
2359
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2360
- "enum": [
2361
- "auto",
2362
- "photo",
2363
- "video",
2364
- "gradient"
2365
- ],
2366
- "default": "auto"
2367
- },
2368
- "mediaPoster": {
2369
- "type": "string",
2370
- "title": "Background poster image",
2371
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2372
- "format": "uri",
2373
- "default": ""
2374
- },
2375
- "mediaPosition": {
2376
- "type": "string",
2377
- "title": "Background focal position",
2378
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2379
- "enum": [
2380
- "center",
2381
- "top",
2382
- "bottom",
2383
- "left",
2384
- "right"
2385
- ],
2386
- "default": "center"
2387
- },
2388
- "mediaTreatment": {
2389
- "type": "string",
2390
- "title": "Background contrast treatment",
2391
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2392
- "enum": [
2393
- "subtle",
2394
- "cinematic",
2395
- "text-safe"
2396
- ],
2397
- "default": "cinematic"
2398
- }
1383
+ ...createBackgroundMediaSchemaProperties()
2399
1384
  },
2400
1385
  "required": [
2401
1386
  "texts",
@@ -2447,63 +1432,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2447
1432
  "maxItems": 3,
2448
1433
  "default": []
2449
1434
  },
2450
- "mediaUrl": {
2451
- "type": "string",
2452
- "title": "Background media",
2453
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2454
- "format": "uri",
2455
- "default": ""
2456
- },
2457
- "mediaKeyword": {
2458
- "type": "string",
2459
- "title": "Background search keyword",
2460
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2461
- "format": "stock-media-keyword",
2462
- "default": ""
2463
- },
2464
- "mediaType": {
2465
- "type": "string",
2466
- "title": "Background media type",
2467
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2468
- "enum": [
2469
- "auto",
2470
- "photo",
2471
- "video",
2472
- "gradient"
2473
- ],
2474
- "default": "auto"
2475
- },
2476
- "mediaPoster": {
2477
- "type": "string",
2478
- "title": "Background poster image",
2479
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2480
- "format": "uri",
2481
- "default": ""
2482
- },
2483
- "mediaPosition": {
2484
- "type": "string",
2485
- "title": "Background focal position",
2486
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2487
- "enum": [
2488
- "center",
2489
- "top",
2490
- "bottom",
2491
- "left",
2492
- "right"
2493
- ],
2494
- "default": "center"
2495
- },
2496
- "mediaTreatment": {
2497
- "type": "string",
2498
- "title": "Background contrast treatment",
2499
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2500
- "enum": [
2501
- "subtle",
2502
- "cinematic",
2503
- "text-safe"
2504
- ],
2505
- "default": "cinematic"
2506
- }
1435
+ ...createBackgroundMediaSchemaProperties()
2507
1436
  },
2508
1437
  "required": [
2509
1438
  "texts",
@@ -2532,62 +1461,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2532
1461
  "description": "Optional action line shown above the URL. Keep it to four words.",
2533
1462
  "default": ""
2534
1463
  },
2535
- "mediaUrl": {
2536
- "type": "string",
2537
- "title": "Background media",
2538
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2539
- "format": "uri",
2540
- "default": ""
2541
- },
2542
- "mediaKeyword": {
2543
- "type": "string",
2544
- "title": "Background search keyword",
2545
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2546
- "default": ""
2547
- },
2548
- "mediaType": {
2549
- "type": "string",
2550
- "title": "Background media type",
2551
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2552
- "enum": [
2553
- "auto",
2554
- "photo",
2555
- "video",
2556
- "gradient"
2557
- ],
2558
- "default": "auto"
2559
- },
2560
- "mediaPoster": {
2561
- "type": "string",
2562
- "title": "Background poster image",
2563
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2564
- "format": "uri",
2565
- "default": ""
2566
- },
2567
- "mediaPosition": {
2568
- "type": "string",
2569
- "title": "Background focal position",
2570
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2571
- "enum": [
2572
- "center",
2573
- "top",
2574
- "bottom",
2575
- "left",
2576
- "right"
2577
- ],
2578
- "default": "center"
2579
- },
2580
- "mediaTreatment": {
2581
- "type": "string",
2582
- "title": "Background contrast treatment",
2583
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2584
- "enum": [
2585
- "subtle",
2586
- "cinematic",
2587
- "text-safe"
2588
- ],
2589
- "default": "cinematic"
2590
- }
1464
+ ...createBackgroundMediaSchemaProperties({ stockMediaKeyword: false })
2591
1465
  },
2592
1466
  "additionalProperties": false,
2593
1467
  "x-vanillasky": {
@@ -2620,63 +1494,7 @@ var BUILTIN_TEMPLATE_SCHEMAS = {
2620
1494
  "description": "Optional action line shown above the URL. Keep it to four words.",
2621
1495
  "default": ""
2622
1496
  },
2623
- "mediaUrl": {
2624
- "type": "string",
2625
- "title": "Background media",
2626
- "description": "Optional photo or video URL behind this scene. When set, replaces the brand gradient.",
2627
- "format": "uri",
2628
- "default": ""
2629
- },
2630
- "mediaKeyword": {
2631
- "type": "string",
2632
- "title": "Background search keyword",
2633
- "description": "2-4 word English term for Pexels stock-footage search (auto-fills mediaUrl).",
2634
- "format": "stock-media-keyword",
2635
- "default": ""
2636
- },
2637
- "mediaType": {
2638
- "type": "string",
2639
- "title": "Background media type",
2640
- "description": "auto detects photo/video from URL. 'gradient' is a deliberate mode \u2014 atmospheric brand-color scene with no stock footage.",
2641
- "enum": [
2642
- "auto",
2643
- "photo",
2644
- "video",
2645
- "gradient"
2646
- ],
2647
- "default": "auto"
2648
- },
2649
- "mediaPoster": {
2650
- "type": "string",
2651
- "title": "Background poster image",
2652
- "description": "Still image URL shown while a video backdrop is decoding its first frame. Auto-filled from Pexels' thumbnail when fillPexelsUrls sets a video mediaUrl. Hides the gradient flash that would otherwise appear in the ~50\u2013400ms gap between a <video> mounting and decoding its first frame.",
2653
- "format": "uri",
2654
- "default": ""
2655
- },
2656
- "mediaPosition": {
2657
- "type": "string",
2658
- "title": "Background focal position",
2659
- "description": "Controls which part of a photo or video stays visible when cover-cropped. Pick the subject's side or vertical anchor after inspecting the frame.",
2660
- "enum": [
2661
- "center",
2662
- "top",
2663
- "bottom",
2664
- "left",
2665
- "right"
2666
- ],
2667
- "default": "center"
2668
- },
2669
- "mediaTreatment": {
2670
- "type": "string",
2671
- "title": "Background contrast treatment",
2672
- "description": "subtle preserves a visual hero; cinematic adds balanced contrast; text-safe adds a stronger wash for copy-heavy scenes.",
2673
- "enum": [
2674
- "subtle",
2675
- "cinematic",
2676
- "text-safe"
2677
- ],
2678
- "default": "cinematic"
2679
- }
1497
+ ...createBackgroundMediaSchemaProperties()
2680
1498
  },
2681
1499
  "required": [
2682
1500
  "headline"