@nodaro/prompts 1.0.1

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 (150) hide show
  1. package/LICENSE +105 -0
  2. package/README.md +27 -0
  3. package/dist/index.cjs +21240 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +3599 -0
  6. package/dist/index.d.ts +3599 -0
  7. package/dist/index.js +20854 -0
  8. package/dist/index.js.map +1 -0
  9. package/package.json +49 -0
  10. package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
  11. package/src/__tests__/action-fx.test.ts +155 -0
  12. package/src/__tests__/apply-picker-json.test.ts +50 -0
  13. package/src/__tests__/assemble-image-input.test.ts +248 -0
  14. package/src/__tests__/assemble-suno-input.test.ts +283 -0
  15. package/src/__tests__/brand-tokens.test.ts +81 -0
  16. package/src/__tests__/build-image-prompt-element-injection.test.ts +118 -0
  17. package/src/__tests__/build-image-prompt-hybrid-format.test.ts +131 -0
  18. package/src/__tests__/build-image-prompt-mentions.test.ts +809 -0
  19. package/src/__tests__/build-image-prompt-reference-cap.test.ts +57 -0
  20. package/src/__tests__/build-image-prompt-reference-numbering.test.ts +237 -0
  21. package/src/__tests__/build-image-prompt-reference-order.test.ts +313 -0
  22. package/src/__tests__/camera-motions-from-connections.test.ts +71 -0
  23. package/src/__tests__/catalog-gapfill.test.ts +53 -0
  24. package/src/__tests__/character-convergence-image.test.ts +217 -0
  25. package/src/__tests__/character-default-role-image.test.ts +167 -0
  26. package/src/__tests__/character-default-role-video.test.ts +168 -0
  27. package/src/__tests__/character-default-role.test.ts +70 -0
  28. package/src/__tests__/character-fx.test.ts +200 -0
  29. package/src/__tests__/entity-prompts-location.test.ts +97 -0
  30. package/src/__tests__/entity-prompts.test.ts +240 -0
  31. package/src/__tests__/expand-extra-refs-role.test.ts +50 -0
  32. package/src/__tests__/factory-presets.test.ts +1045 -0
  33. package/src/__tests__/factory-snippets.test.ts +68 -0
  34. package/src/__tests__/framing-multi.test.ts +71 -0
  35. package/src/__tests__/framing-vantage.test.ts +39 -0
  36. package/src/__tests__/i18n-entry-completeness.test.ts +269 -0
  37. package/src/__tests__/identity-lock.test.ts +46 -0
  38. package/src/__tests__/instrumentation.test.ts +68 -0
  39. package/src/__tests__/lighting-multi.test.ts +68 -0
  40. package/src/__tests__/location-convergence-image.test.ts +124 -0
  41. package/src/__tests__/mention-lock-flag.test.ts +499 -0
  42. package/src/__tests__/multi-picker-spec.test.ts +71 -0
  43. package/src/__tests__/music-genre.test.ts +103 -0
  44. package/src/__tests__/music-mood.test.ts +87 -0
  45. package/src/__tests__/object-creature-convergence-image.test.ts +105 -0
  46. package/src/__tests__/parameter-prompt-hint.test.ts +270 -0
  47. package/src/__tests__/parameter-registry-sync.test.ts +243 -0
  48. package/src/__tests__/person-age.test.ts +80 -0
  49. package/src/__tests__/person-analyzer-invariants.test.ts +47 -0
  50. package/src/__tests__/person-body-axes.test.ts +67 -0
  51. package/src/__tests__/person-facial-geometry.test.ts +156 -0
  52. package/src/__tests__/person-regional-aesthetic.test.ts +161 -0
  53. package/src/__tests__/person-sections.test.ts +18 -0
  54. package/src/__tests__/picker-analyzer-registry.test.ts +108 -0
  55. package/src/__tests__/picker-catalogs-project.test.ts +85 -0
  56. package/src/__tests__/picker-catalogs.test.ts +53 -0
  57. package/src/__tests__/picker-limits.test.ts +20 -0
  58. package/src/__tests__/prompt-builder-segments.test.ts +183 -0
  59. package/src/__tests__/prompt-builder-structured-fields.test.ts +40 -0
  60. package/src/__tests__/prompt-builder.test.ts +1773 -0
  61. package/src/__tests__/prompt-wizard-categories.test.ts +31 -0
  62. package/src/__tests__/provider-prompt-doctrine.test.ts +49 -0
  63. package/src/__tests__/resolve-prompt-append.test.ts +58 -0
  64. package/src/__tests__/resolve-prompt.test.ts +44 -0
  65. package/src/__tests__/role-picker-shared.test.ts +208 -0
  66. package/src/__tests__/seedance-2-inputs.test.ts +173 -0
  67. package/src/__tests__/seedance-extend.test.ts +44 -0
  68. package/src/__tests__/sound-aggregator.test.ts +350 -0
  69. package/src/__tests__/style-presets.test.ts +34 -0
  70. package/src/__tests__/temporal-multi.test.ts +74 -0
  71. package/src/__tests__/transitions.test.ts +213 -0
  72. package/src/__tests__/video-reference-features.test.ts +41 -0
  73. package/src/__tests__/video-reference-leading-refs.test.ts +90 -0
  74. package/src/__tests__/video-reference-resolver.test.ts +233 -0
  75. package/src/__tests__/video-reference-roles.test.ts +96 -0
  76. package/src/__tests__/voice-character.test.ts +48 -0
  77. package/src/__tests__/voice-delivery.test.ts +41 -0
  78. package/src/__tests__/wardrobe.test.ts +25 -0
  79. package/src/action-fx.ts +255 -0
  80. package/src/aesthetic.ts +435 -0
  81. package/src/assemble-image-input.ts +236 -0
  82. package/src/assemble-suno-input.ts +147 -0
  83. package/src/atmosphere.ts +104 -0
  84. package/src/backdrop.ts +131 -0
  85. package/src/brand-tokens.ts +154 -0
  86. package/src/camera-format.ts +76 -0
  87. package/src/camera-motions.ts +615 -0
  88. package/src/character-fx.ts +274 -0
  89. package/src/color-look.ts +103 -0
  90. package/src/composition-effects.ts +67 -0
  91. package/src/entity-prompts.ts +231 -0
  92. package/src/era.ts +292 -0
  93. package/src/exposure-settings.ts +142 -0
  94. package/src/factory-presets/generate-image.ts +1644 -0
  95. package/src/factory-presets/generate-video.ts +1116 -0
  96. package/src/factory-presets/index.ts +46 -0
  97. package/src/factory-presets/lottie-overlay.ts +166 -0
  98. package/src/factory-presets/motion-graphics.ts +350 -0
  99. package/src/factory-presets/music.ts +734 -0
  100. package/src/factory-presets/sfx.ts +136 -0
  101. package/src/factory-presets/shared-image.ts +207 -0
  102. package/src/factory-presets/switchx.ts +65 -0
  103. package/src/factory-presets/text.ts +292 -0
  104. package/src/factory-presets/types.ts +51 -0
  105. package/src/factory-presets/video-edit.ts +136 -0
  106. package/src/factory-presets/voice.ts +172 -0
  107. package/src/factory-presets.ts +2 -0
  108. package/src/factory-snippets/catalog.ts +105 -0
  109. package/src/factory-snippets/index.ts +16 -0
  110. package/src/factory-snippets/types.ts +33 -0
  111. package/src/framing.ts +634 -0
  112. package/src/held-prop.ts +187 -0
  113. package/src/identity-lock.ts +213 -0
  114. package/src/index.ts +66 -0
  115. package/src/instrumentation.ts +337 -0
  116. package/src/lens.ts +59 -0
  117. package/src/lighting.ts +229 -0
  118. package/src/loop-subject.ts +276 -0
  119. package/src/materials.ts +184 -0
  120. package/src/mood.ts +186 -0
  121. package/src/music-genre.ts +662 -0
  122. package/src/music-mood.ts +137 -0
  123. package/src/object-asset-presets.ts +81 -0
  124. package/src/parameter-prompt-hint.ts +281 -0
  125. package/src/person.ts +1368 -0
  126. package/src/photo-genre.ts +151 -0
  127. package/src/photographer.ts +612 -0
  128. package/src/picker-analyzer-registry.ts +374 -0
  129. package/src/picker-catalogs.ts +858 -0
  130. package/src/pose.ts +246 -0
  131. package/src/post-process-effects.ts +94 -0
  132. package/src/prompt-builder-structured-fields.ts +116 -0
  133. package/src/prompt-builder.ts +2964 -0
  134. package/src/prompt-templates.ts +50 -0
  135. package/src/prompt-wizard-categories.ts +334 -0
  136. package/src/provider-prompt-doctrine.ts +85 -0
  137. package/src/render-quality.ts +89 -0
  138. package/src/resolve-prompt.ts +120 -0
  139. package/src/seedance-2-inputs.ts +100 -0
  140. package/src/setting.ts +130 -0
  141. package/src/sound-aggregator.ts +241 -0
  142. package/src/style-presets.ts +162 -0
  143. package/src/style.ts +99 -0
  144. package/src/styling.ts +585 -0
  145. package/src/temporal.ts +151 -0
  146. package/src/transitions.ts +333 -0
  147. package/src/video-reference-resolver.ts +823 -0
  148. package/src/voice-character.ts +237 -0
  149. package/src/voice-delivery.ts +142 -0
  150. package/src/wardrobe.ts +179 -0
@@ -0,0 +1,46 @@
1
+ import type { FactoryPreset } from "./types.js"
2
+ import { stylizedSubjectFor, editsFor } from "./shared-image.js"
3
+ import { GENERATE_IMAGE_PRESETS } from "./generate-image.js"
4
+ import { GENERATE_VIDEO_PRESETS } from "./generate-video.js"
5
+ import { GENERATE_MUSIC_PRESETS, SUNO_GENERATE_PRESETS } from "./music.js"
6
+ import { TEXT_TO_SPEECH_PRESETS, VOICE_DESIGN_PRESETS, VOICE_CHANGER_PRESETS } from "./voice.js"
7
+ import { TEXT_TO_AUDIO_PRESETS } from "./sfx.js"
8
+ import { LLM_CHAT_PRESETS, GENERATE_SCRIPT_PRESETS, IMAGE_TO_TEXT_PRESETS } from "./text.js"
9
+ import { VIDEO_TO_VIDEO_PRESETS, ADD_CAPTIONS_PRESETS, COMBINE_VIDEOS_PRESETS } from "./video-edit.js"
10
+ import { SWITCHX_PRESETS } from "./switchx.js"
11
+ import { MOTION_GRAPHICS_PRESETS } from "./motion-graphics.js"
12
+ import { LOTTIE_OVERLAY_PRESETS } from "./lottie-overlay.js"
13
+
14
+ export type { FactoryPreset, FactoryPresetGroup } from "./types.js"
15
+ export { groupFactoryPresets } from "./types.js"
16
+
17
+ /** System/factory presets shipped with the app. Assembled here in the original
18
+ * single-file key order; each value lives in its per-domain module. */
19
+ export const FACTORY_PRESETS: Readonly<Record<string, readonly FactoryPreset[]>> = {
20
+ "generate-image": GENERATE_IMAGE_PRESETS,
21
+
22
+ // modify-image shares the Stylized Subject + Edits catalogs with generate-image
23
+ // (single source of truth in STYLIZED_SUBJECT / IMAGE_EDITS). modify-image is
24
+ // slated for deprecation in favor of generate-image — when removed, drop this key.
25
+ "modify-image": [...stylizedSubjectFor("modify-image"), ...editsFor("modify-image")],
26
+ "generate-video": GENERATE_VIDEO_PRESETS,
27
+ "text-to-speech": TEXT_TO_SPEECH_PRESETS,
28
+ "text-to-audio": TEXT_TO_AUDIO_PRESETS,
29
+ "generate-music": GENERATE_MUSIC_PRESETS,
30
+ "suno-generate": SUNO_GENERATE_PRESETS,
31
+ "llm-chat": LLM_CHAT_PRESETS,
32
+ "generate-script": GENERATE_SCRIPT_PRESETS,
33
+ "image-to-text": IMAGE_TO_TEXT_PRESETS,
34
+ "voice-design": VOICE_DESIGN_PRESETS,
35
+ "video-to-video": VIDEO_TO_VIDEO_PRESETS,
36
+ "switchx": SWITCHX_PRESETS,
37
+ "voice-changer": VOICE_CHANGER_PRESETS,
38
+ "add-captions": ADD_CAPTIONS_PRESETS,
39
+ "combine-videos": COMBINE_VIDEOS_PRESETS,
40
+ "motion-graphics": MOTION_GRAPHICS_PRESETS,
41
+ "lottie-overlay": LOTTIE_OVERLAY_PRESETS,
42
+ }
43
+
44
+ export function getFactoryPresets(nodeType: string): readonly FactoryPreset[] {
45
+ return FACTORY_PRESETS[nodeType] ?? []
46
+ }
@@ -0,0 +1,166 @@
1
+ import type { FactoryPreset } from "./types.js"
2
+
3
+ /**
4
+ * Factory presets for the `lottie-overlay` node — placement/timing briefs the
5
+ * overlay planner LLM (see backend/src/prompts/lottie-overlay-system.ts) turns
6
+ * into a timed LottieOverlayPlan over the source video.
7
+ *
8
+ * Each preset's `data` carries ONLY `overlayPrompt`. Deliberately NOT set:
9
+ * `durationSeconds` (the plan timeline must track the SOURCE VIDEO — a baked
10
+ * preset duration would silently truncate the plan on longer footage), `fps`
11
+ * (node default 30), `llmModel` (the user's tier choice), and `overlayPlan`
12
+ * (generated state — cleared generically via PRESET_APPLY_CLEAR_KEYS).
13
+ *
14
+ * Every prompt uses the Nodaro `{variable || default}` reference syntax
15
+ * (node-refs.ts, shipped in PR #3250): run unedited and the default applies;
16
+ * type a value over the token; or wire an upstream node whose label matches
17
+ * the variable name and its output fills the slot at execution time. Both DAG
18
+ * engines resolve the tokens for this node's typed prompt, and the planner's
19
+ * system prompt reads any token that survives unresolved (direct API/MCP
20
+ * calls) as "<variable> = <default>" — so the braces never leak into a plan.
21
+ *
22
+ * The "Connected Graphic" folder targets the asset wired into the node's
23
+ * `lottie` input (e.g. a Motion Graphics node's authored Lottie); each of
24
+ * those prompts ends with the exclusivity clause "only the connected graphic"
25
+ * so the planner never substitutes catalog animations. The other folders name
26
+ * their built-in catalog assets explicitly (LOTTIE_OVERLAY_CATALOG slugs).
27
+ */
28
+ export const LOTTIE_OVERLAY_PRESETS: readonly FactoryPreset[] = [
29
+ // ── Connected Graphic ─────────────────────────────────────────────────────
30
+ {
31
+ id: "lottie-overlay/connected-custom",
32
+ name: "Overlay Connected Graphic",
33
+ description: "Place the wired graphic — position, start time, size and play mode are variables.",
34
+ group: "Connected Graphic",
35
+ data: {
36
+ overlayPrompt:
37
+ "Overlay the connected graphic {position || centered} over the video, starting at {start time || 1 second}. Play it {play mode || once at its natural duration, then remove it}. Size it {size || to about half the frame width}, keeping its aspect ratio. Use only the connected graphic — no built-in animations.",
38
+ },
39
+ },
40
+ {
41
+ id: "lottie-overlay/connected-full-canvas",
42
+ name: "Full-Canvas Graphic",
43
+ description: "Stretch the wired graphic across the whole frame — for lower thirds, titles and other full-canvas overlays.",
44
+ group: "Connected Graphic",
45
+ data: {
46
+ overlayPrompt:
47
+ "Stretch the connected graphic across the entire frame (x 0, y 0, width 100, height 100) — it was authored on a full transparent canvas (a lower third, title or badge), so its own internal layout decides where content sits. Start it at {start time || 1 second} and play it {play mode || once at its natural duration}. Full opacity. Use only the connected graphic — no built-in animations.",
48
+ },
49
+ },
50
+ {
51
+ id: "lottie-overlay/connected-intro",
52
+ name: "Intro Sting",
53
+ description: "Open the video with the wired graphic, full-frame, then get out of the way.",
54
+ group: "Connected Graphic",
55
+ data: {
56
+ overlayPrompt:
57
+ "Open the video with the connected graphic as an intro sting: full-frame from the very first frame, playing once at its natural duration (no loop), then gone for the rest of the video. {treatment || Full opacity, no other effects.} Use only the connected graphic — no built-in animations.",
58
+ },
59
+ },
60
+ {
61
+ id: "lottie-overlay/connected-outro",
62
+ name: "Outro Sting",
63
+ description: "Close the video with the wired graphic, timed to end on the last frame.",
64
+ group: "Connected Graphic",
65
+ data: {
66
+ overlayPrompt:
67
+ "Close the video with the connected graphic: show it full-frame over the final {outro window || 4 seconds}, timed so it ends exactly on the video's last frame. If its natural duration is shorter than the window, start it later so it still finishes on the last frame; if it is a looping animation, loop it through the window. Use only the connected graphic — no built-in animations.",
68
+ },
69
+ },
70
+ {
71
+ id: "lottie-overlay/connected-corner-bug",
72
+ name: "Corner Bug (Loop)",
73
+ description: "The wired graphic as a small looping watermark in a corner.",
74
+ group: "Connected Graphic",
75
+ data: {
76
+ overlayPrompt:
77
+ "Pin the connected graphic as a small corner bug in the {corner || bottom-right} corner, about {size || 14}% of the frame width, at {opacity || 80}% opacity, looping from the first frame to the last. Keep a small margin (about 3%) from the edges so it never clips. Use only the connected graphic — no built-in animations.",
78
+ },
79
+ },
80
+ {
81
+ id: "lottie-overlay/connected-reaction-pop",
82
+ name: "Reaction Pop",
83
+ description: "Pop the wired graphic in at a moment, sized like a reaction sticker.",
84
+ group: "Connected Graphic",
85
+ data: {
86
+ overlayPrompt:
87
+ "Pop the connected graphic in at {moment || 2 seconds}, {position || in the lower-right area}, sized like a reaction sticker ({size || about 22}% of the frame width). Play it {play mode || once at its natural duration} and remove it. Use only the connected graphic — no built-in animations.",
88
+ },
89
+ },
90
+
91
+ // ── Celebration & FX ──────────────────────────────────────────────────────
92
+ {
93
+ id: "lottie-overlay/celebration-moment",
94
+ name: "Celebration Moment",
95
+ description: "Confetti burst at a key moment with a short sparkle tail.",
96
+ group: "Celebration & FX",
97
+ data: {
98
+ overlayPrompt:
99
+ "Fire a confetti burst at {moment || 3 seconds} covering most of the frame, one-shot. As it lands, add twinkling star sparkles over the {sparkle area || upper third} for {sparkle window || 3 seconds}, then clear the frame. Use the built-in confetti-burst and stars-sparkle assets.",
100
+ },
101
+ },
102
+ {
103
+ id: "lottie-overlay/grand-finale",
104
+ name: "Grand Finale",
105
+ description: "Fireworks and confetti building over the video's final seconds.",
106
+ group: "Celebration & FX",
107
+ data: {
108
+ overlayPrompt:
109
+ "Build a finale across the last {finale window || 4 seconds} of the video: fireworks bursting over the upper half of the frame, plus a confetti burst as the window opens, both timed to end on the video's last frame. One-shot energy — nothing keeps looping past the end. Use the built-in fireworks and confetti-burst assets.",
110
+ },
111
+ },
112
+ {
113
+ id: "lottie-overlay/ambient-particles",
114
+ name: "Ambient Particles",
115
+ description: "Soft full-frame particles for the whole video; the footage stays the hero.",
116
+ group: "Celebration & FX",
117
+ data: {
118
+ overlayPrompt:
119
+ "Lay the built-in floating-particles asset over the whole video: full-frame, looping from the first frame to the last, at {opacity || 40}% opacity so the footage stays the hero. Calm and ambient — add nothing else.",
120
+ },
121
+ },
122
+
123
+ // ── Reactions & Social ────────────────────────────────────────────────────
124
+ {
125
+ id: "lottie-overlay/heart-reaction",
126
+ name: "Heart Reaction",
127
+ description: "Pulsing heart near a corner at a moment.",
128
+ group: "Reactions & Social",
129
+ data: {
130
+ overlayPrompt:
131
+ "Show the built-in heart-pulse near the {corner || bottom-right} corner, starting at {moment || 2 seconds} and looping for {window || 3 seconds}, about {size || 18}% of the frame width, then remove it.",
132
+ },
133
+ },
134
+ {
135
+ id: "lottie-overlay/hype-combo",
136
+ name: "Hype Combo",
137
+ description: "Thumbs-up pop plus fire emoji at a key beat.",
138
+ group: "Reactions & Social",
139
+ data: {
140
+ overlayPrompt:
141
+ "At {moment || 2 seconds}, pop the built-in thumbs-up near the {corner || bottom-right} corner (one-shot) and the fire-flame emoji right beside it, looping for {window || 3 seconds}. Medium reaction size (15-20% of the frame width each), staggered a few frames apart so they land with rhythm.",
142
+ },
143
+ },
144
+
145
+ // ── Emphasis & UI ─────────────────────────────────────────────────────────
146
+ {
147
+ id: "lottie-overlay/point-it-out",
148
+ name: "Point It Out",
149
+ description: "Animated arrow aimed at a spot for a few seconds.",
150
+ group: "Emphasis & UI",
151
+ data: {
152
+ overlayPrompt:
153
+ "Aim the built-in arrow-pointer at {target || the center of the frame} from {start time || 1 second} for {window || 2.5 seconds}, small (about 12-15% of the frame width), looping while visible, positioned beside the target so it points clearly without covering it.",
154
+ },
155
+ },
156
+ {
157
+ id: "lottie-overlay/success-beat",
158
+ name: "Success Beat",
159
+ description: "Checkmark pop to mark a win or completed step.",
160
+ group: "Emphasis & UI",
161
+ data: {
162
+ overlayPrompt:
163
+ "Mark a success beat: pop the built-in checkmark-success {position || centered} at {moment || 2 seconds}, about {size || 20}% of the frame width, playing once and then gone. Crisp and quick — no lingering.",
164
+ },
165
+ },
166
+ ]
@@ -0,0 +1,350 @@
1
+ import type { FactoryPreset } from "./types.js"
2
+
3
+ /**
4
+ * Factory presets for the `motion-graphics` node — all targeting the Lottie
5
+ * engine (`engine: "lottie"`), which has an LLM author a complete, valid Lottie
6
+ * (Bodymovin) JSON document with named editable slots.
7
+ *
8
+ * Each preset's `data` sets every portable configurable field (engine,
9
+ * motionPrompt, aspectRatio, durationSeconds, backgroundColor) so switching
10
+ * presets never leaves stale canvas settings. `fps` (node default 30) and
11
+ * `llmModel` (the user's tier choice) are deliberately NOT set. `label` is NOT
12
+ * carried either — factory `data` is capture-shaped (the FactoryPreset.data
13
+ * contract excludes label/fieldMappings/runtime keys, pinned by the
14
+ * `extractPresetData(data).toEqual(data)` round-trip test); the dropdown already
15
+ * surfaces the active preset's `name` in its trigger. No preset carries
16
+ * `motionPlan` — generated-plan staleness is solved generically via
17
+ * PRESET_APPLY_CLEAR_KEYS (see node-preset-extract.ts), not per-preset.
18
+ *
19
+ * The prompts are written to work WITH the engine's contract (see
20
+ * backend/src/prompts/lottie-graphic-system.ts): group-wrapped shapes, 0–1
21
+ * colors, a root `slots` map with `{"sid"}` refs, raw-string text slots, the
22
+ * 20-font safelist, vector-only output, ≤50 layers, and seamless-loop or
23
+ * exit-before-`op` discipline. Every prompt ends with
24
+ * `Expose slots: <sids>.` using stable lowerCamelCase sids so slot edits
25
+ * survive regeneration and published-app field exposure is dependable.
26
+ *
27
+ * fps is 30, so frame counts below map to seconds as frames = seconds × 30
28
+ * (a 5s preset = 150 frames; "20 frames before the end" = 0.67s before `op`).
29
+ */
30
+ export const MOTION_GRAPHICS_PRESETS: readonly FactoryPreset[] = [
31
+ // ── Titles & Text ─────────────────────────────────────────────────────────
32
+ {
33
+ id: "motion-graphics/lower-third",
34
+ name: "Lower Third",
35
+ description: "Animated lower third with editable name, role and accent color.",
36
+ group: "Titles & Text",
37
+ data: {
38
+ engine: "lottie",
39
+ aspectRatio: "16:9",
40
+ durationSeconds: 5,
41
+ backgroundColor: "#00000000",
42
+ motionPrompt:
43
+ "Lower third for a name and role, anchored in the lower-left title-safe area (x ≈ 8% of width, baseline ≈ 84% of height). A slim accent bar (the brand color) slides in from the left with a slight overshoot and settles over about 14 frames; the name in bold white rises and fades in above the role in lighter gray, staggered 6–8 frames after the bar, each easing out. Hold steady through the middle, then everything exits with a clean fade and a small slide-left completing 20 frames before the end — nothing cuts mid-motion. Palette: one saturated brand accent plus white and a neutral gray, restrained and broadcast-clean. Transparent background — this overlays footage, so add no full-frame backdrop. One-shot, not looped: the entrance plays once and the exit finishes before the out point. Use the placeholder name \"Jane Doe\" and role \"Product Designer\" so users retype their own. Expose slots: primaryColor, nameText, roleText.",
44
+ },
45
+ },
46
+ {
47
+ id: "motion-graphics/title-card",
48
+ name: "Title Card",
49
+ description: "Centered title and subtitle with a confident scale-up entrance.",
50
+ group: "Titles & Text",
51
+ data: {
52
+ engine: "lottie",
53
+ aspectRatio: "16:9",
54
+ durationSeconds: 4,
55
+ backgroundColor: "#0b0b12",
56
+ motionPrompt:
57
+ "A centered title card with a clear type hierarchy: a large bold headline above a smaller subtitle, generously spaced and optically centered. The headline scales up from about 92% with a touch of overshoot and fades in over 16 frames; the subtitle follows 8 frames later, rising a few pixels as it fades. A thin decorative accent rule draws in beneath the title using a trim-path reveal. Hold the composition still in the middle, then let everything fade out together completing 20 frames before the end. Easing: ease-out on the hero scale, gentle ease on supporting elements. Palette: white and light-gray type with a single accent-colored rule, set against the dark opaque background. One-shot, not looped — the exit completes before the out point. Use the placeholder title \"Your Title Here\" and subtitle \"A short supporting line\". Expose slots: primaryColor, titleText, subtitleText.",
58
+ },
59
+ },
60
+ {
61
+ id: "motion-graphics/kinetic-typography",
62
+ name: "Kinetic Typography",
63
+ description: "Three words cascade in with punchy staggered motion.",
64
+ group: "Titles & Text",
65
+ data: {
66
+ engine: "lottie",
67
+ aspectRatio: "16:9",
68
+ durationSeconds: 5,
69
+ backgroundColor: "#0a0a0a",
70
+ motionPrompt:
71
+ "Punchy kinetic typography: three bold words stacked or marching across the center, each its own text layer, entering in a staggered cascade 7–9 frames apart. Vary the rhythm — the first word slides up from below with overshoot, the second snaps in from the left, the third scales up from 85% and settles — so the motion feels choreographed, not uniform. Use a heavy display family from the safelist (Anton, Bebas Neue or Oswald). One word is rendered in the accent color for emphasis; the rest are white. Hold the full phrase briefly, then exit each word on a quick staggered fade completing 20 frames before the end. Dark opaque background, no full-frame rectangle beyond the stated bg. One-shot, not looped. Use placeholder words \"MAKE\", \"IT\", \"MOVE\" so users retype their own copy. Expose slots: accentColor, wordOne, wordTwo, wordThree.",
72
+ },
73
+ },
74
+ {
75
+ id: "motion-graphics/quote-card",
76
+ name: "Quote Card",
77
+ description: "Elegant pull-quote with attribution and a draw-on accent mark.",
78
+ group: "Titles & Text",
79
+ data: {
80
+ engine: "lottie",
81
+ aspectRatio: "16:9",
82
+ durationSeconds: 6,
83
+ backgroundColor: "#11131a",
84
+ motionPrompt:
85
+ "An elegant pull-quote card. A large accent-colored quotation mark draws on first via a trim-path reveal over about 18 frames, then the quote text fades and rises into the center set in a refined serif from the safelist (Playfair Display or Lora). The attribution line fades in 10 frames later, smaller and in lighter gray, beneath a short accent rule that wipes in from the left. Let it breathe in the middle of the timeline, then fade the whole group out together completing 24 frames before the end. Easing is soft and unhurried throughout — ease-out, no overshoot — to match the editorial tone. Palette: warm white type, a muted gray attribution, and one accent color on the quote mark and rule, over the dark opaque background. One-shot, not looped. Use the placeholder quote \"Design is intelligence made visible.\" and attribution \"— Alina Wheeler\". Expose slots: accentColor, quoteText, attributionText.",
86
+ },
87
+ },
88
+ {
89
+ id: "motion-graphics/end-card-cta",
90
+ name: "End Card (CTA)",
91
+ description: "Outro card with a headline and a pulsing call-to-action button.",
92
+ group: "Titles & Text",
93
+ data: {
94
+ engine: "lottie",
95
+ aspectRatio: "16:9",
96
+ durationSeconds: 5,
97
+ backgroundColor: "#0b0b12",
98
+ motionPrompt:
99
+ "An outro end card that drives action. A bold white headline scales up from 90% with a hint of overshoot and fades in over 16 frames, centered in the upper-middle. Below it, a rounded call-to-action button (filled with the primary color, label in white) springs in from slightly below 10 frames later with an anticipation-and-overshoot settle. Once settled, the button breathes with a subtle scale pulse (about 100%→104%→100%) on a gentle loop to draw the eye. Keep the headline static after it lands. Exit is optional and soft — if present, fade only, completing 20 frames before the end. Palette: white headline, one saturated primary on the button, dark opaque background. The headline is one-shot; the button's pulse loops seamlessly. Use the placeholder headline \"Thanks for watching\" and CTA label \"SUBSCRIBE\". Expose slots: primaryColor, headlineText, ctaText.",
100
+ },
101
+ },
102
+
103
+ // ── Intros & Logos ────────────────────────────────────────────────────────
104
+ {
105
+ id: "motion-graphics/logo-sting",
106
+ name: "Logo Sting",
107
+ description: "Punchy brand reveal with anticipation and overshoot.",
108
+ group: "Intros & Logos",
109
+ data: {
110
+ engine: "lottie",
111
+ aspectRatio: "16:9",
112
+ durationSeconds: 4,
113
+ backgroundColor: "#000000",
114
+ motionPrompt:
115
+ "A tight, punchy logo sting built from vector shapes. A simple geometric brand mark (in the brand color) performs the hero move with real anticipation and overshoot: it scales down slightly and counter-rotates a few degrees over the first 8 frames, then snaps up to full size, overshooting to about 108% before settling back over the next 12 frames. As the mark lands, the brand name wordmark wipes or fades in beside or beneath it, 6 frames behind, easing out. Hold the locked-up logo still through the middle. Exit on a clean fade (and optional slight scale-down) completing 20 frames before the end — never cut to black mid-motion. Keep total action under two seconds. Palette: the brand color plus white, restrained. Opaque black background. One-shot, not looped. Use the placeholder brand name \"ACME\". Expose slots: brandColor, brandName.",
116
+ },
117
+ },
118
+ {
119
+ id: "motion-graphics/channel-intro",
120
+ name: "Channel Intro",
121
+ description: "Energetic channel open with name, tagline and accent shapes.",
122
+ group: "Intros & Logos",
123
+ data: {
124
+ engine: "lottie",
125
+ aspectRatio: "16:9",
126
+ durationSeconds: 5,
127
+ backgroundColor: "#0a0a14",
128
+ motionPrompt:
129
+ "An energetic channel intro. Two or three accent-colored geometric shapes (a bar, a circle, a triangle) sweep in from opposite edges with overshoot and converge toward center over the first 18 frames, establishing rhythm. The channel name then scales up from 88% with overshoot and fades in, set in a bold family from the safelist (Montserrat or Poppins); the tagline fades in 8 frames later beneath it in lighter gray. The accent shapes settle into a tidy lockup behind or beside the type. Hold briefly, then exit everything together with a fade and a small slide completing 20 frames before the end. Easing: snappy overshoot on the shapes and the name, ease-out on the tagline. Palette: one or two accent colors plus white over the dark opaque background. One-shot, not looped. Use the placeholder channel name \"My Channel\" and tagline \"new videos every week\". Expose slots: primaryColor, channelName, taglineText.",
130
+ },
131
+ },
132
+ {
133
+ id: "motion-graphics/countdown",
134
+ name: "Countdown",
135
+ description: "5-second ring countdown from 5 to 1 with a sweeping arc.",
136
+ group: "Intros & Logos",
137
+ data: {
138
+ engine: "lottie",
139
+ aspectRatio: "16:9",
140
+ durationSeconds: 6,
141
+ backgroundColor: "#000000",
142
+ motionPrompt:
143
+ "A centered countdown from 5 down to 1. A circular ring (stroked in the ring color) sits in the center; a second arc in the same color sweeps around it once per second via an animated trim path, completing one full revolution every 30 frames as a steady visual metronome. Inside the ring, a SINGLE text layer shows the current number in a large bold face (number color), keyframed once per second so the displayed digit steps 5 → 4 → 3 → 2 → 1 across the timeline — the digits are deliberately baked into the keyframes, NOT slotted. On each step, give the number a quick scale-pop (about 120%→100%) and a fast cross-fade so the change reads crisply. After \"1\", let the ring and number fade out together completing 20 frames before the end so nothing cuts abruptly. Palette: a single accent ring color and a white-ish number color over the opaque black background. One-shot, not looped. Expose slots: ringColor, numberColor.",
144
+ },
145
+ },
146
+
147
+ // ── Social & CTA ──────────────────────────────────────────────────────────
148
+ {
149
+ id: "motion-graphics/subscribe-reminder",
150
+ name: "Subscribe Reminder",
151
+ description: "Overlay subscribe button that pops in and pulses.",
152
+ group: "Social & CTA",
153
+ data: {
154
+ engine: "lottie",
155
+ aspectRatio: "16:9",
156
+ durationSeconds: 4,
157
+ backgroundColor: "#00000000",
158
+ motionPrompt:
159
+ "An overlay subscribe button for the lower-third area (lower-center or lower-left, inside the title-safe margin). A rounded pill filled with the button color springs in from slightly below with anticipation and overshoot, settling over about 12 frames; the button label in bold white fades in 4 frames behind it. A small play-triangle or bell glyph (white, vector) sits to the left of the label and gives a quick wiggle-free nod — a single tilt and return — as the button lands. Once settled, the whole button breathes with a gentle scale pulse (100%→104%→100%) on a seamless loop to attract attention, then fades out cleanly completing 16 frames before the end. Palette: one saturated button color plus white. Transparent background — this overlays footage, so add no backdrop. The entrance is one-shot; the pulse loops seamlessly. Use the placeholder label \"SUBSCRIBE\". Expose slots: buttonColor, buttonText.",
160
+ },
161
+ },
162
+ {
163
+ id: "motion-graphics/like-follow-bug",
164
+ name: "Like + Follow Bug",
165
+ description: "Corner bug with a heart pop and editable handle.",
166
+ group: "Social & CTA",
167
+ data: {
168
+ engine: "lottie",
169
+ aspectRatio: "16:9",
170
+ durationSeconds: 3,
171
+ backgroundColor: "#00000000",
172
+ motionPrompt:
173
+ "A compact corner bug for the lower-left, sized small so it never blocks the shot. A heart icon built from a vector path (filled with the accent color) pops in with anticipation and overshoot — scaling from 0 with a slight squash-and-stretch over about 10 frames — and emits two or three small accent particles that fan out and fade as it lands. Beside the heart, a handle label in bold white slides in from the left 4 frames behind, easing out. Hold the lockup briefly, then exit with a quick fade and slight slide-down completing 12 frames before the end. Keep it lively but short — under three seconds total. Palette: one accent color on the heart and particles plus white text. Transparent background — overlays footage, no backdrop. One-shot, not looped. Use the placeholder handle \"@yourhandle\". Expose slots: accentColor, handleText.",
174
+ },
175
+ },
176
+ {
177
+ id: "motion-graphics/sale-badge",
178
+ name: "Sale Badge",
179
+ description: "Square promo badge that stamps in with a starburst.",
180
+ group: "Social & CTA",
181
+ data: {
182
+ engine: "lottie",
183
+ aspectRatio: "1:1",
184
+ durationSeconds: 3,
185
+ backgroundColor: "#00000000",
186
+ motionPrompt:
187
+ "A bold square promo badge centered in frame. A starburst or rounded medallion (filled with the badge color, built as a star/polygon or circle group) stamps in with strong anticipation and overshoot — counter-scaling down then snapping up past 100% to about 110% and settling over 12 frames, with a small counter-rotation for energy. The headline sale text scales up inside it in heavy white type from the safelist (Anton or Bebas Neue) 4 frames behind, and a smaller detail line fades in below 6 frames after that. Add a subtle continuous slow rotation (a few degrees back and forth) to keep the badge alive. Exit on a quick scale-down and fade completing 14 frames before the end. Palette: one vivid badge color plus white text. Transparent background — overlays a product shot or post, no backdrop. One-shot entrance; the gentle rotation loops seamlessly. Use the placeholder sale text \"50% OFF\" and detail \"this weekend only\". Expose slots: badgeColor, saleText, detailText.",
188
+ },
189
+ },
190
+ {
191
+ id: "motion-graphics/story-highlight",
192
+ name: "Story Highlight",
193
+ description: "Vertical story title card with headline and subtext.",
194
+ group: "Social & CTA",
195
+ data: {
196
+ engine: "lottie",
197
+ aspectRatio: "9:16",
198
+ durationSeconds: 5,
199
+ backgroundColor: "#10101a",
200
+ motionPrompt:
201
+ "A vertical (portrait) story highlight title card composed for the upper-middle of a tall phone frame, clear of phone UI at top and bottom. A short accent bar wipes in from the left, then a punchy headline scales up from 90% with overshoot and fades in beneath it in bold white (Poppins or Montserrat from the safelist); a subtext line fades in 8 frames later in lighter gray. A couple of small accent dots or a thin underline animate in to add rhythm. Hold the layout still through the middle, then fade everything out together completing 20 frames before the end. Easing: overshoot on the headline, ease-out on supporting elements. Palette: white and gray type with one accent color, over the dark opaque background. One-shot, not looped. Use the placeholder headline \"BEHIND THE SCENES\" and subtext \"swipe up to watch\". Expose slots: primaryColor, headlineText, subText.",
202
+ },
203
+ },
204
+
205
+ // ── UI & Icons ────────────────────────────────────────────────────────────
206
+ {
207
+ id: "motion-graphics/loader-spinner",
208
+ name: "Loader / Spinner",
209
+ description: "Seamless dot-trail loading spinner for UI overlays.",
210
+ group: "UI & Icons",
211
+ data: {
212
+ engine: "lottie",
213
+ aspectRatio: "1:1",
214
+ durationSeconds: 3,
215
+ backgroundColor: "#00000000",
216
+ motionPrompt:
217
+ "A clean, seamless loading spinner centered in frame, built for UI overlays. Arrange a ring of small dots (about 8–12, group-wrapped ellipses) around a circle; rotate the whole group continuously and smoothly so it completes an exact whole number of revolutions across the timeline and the last frame matches the first — a perfect seamless loop with no visible seam or stutter. Drive a chasing fade around the ring so each dot brightens then dims in sequence (a trailing comet effect): the lead dots use the dot color at full opacity and the tail fades toward the trail color. Use linear, constant-speed rotation (mechanical, not eased) so it spins forever evenly. Keep it under the layer budget by reusing a repeater or a tight set of dot groups. Transparent background — overlays a UI, no backdrop. Seamless loop — every animated property's last keyframe repeats its first. Expose slots: dotColor, trailColor.",
218
+ },
219
+ },
220
+ {
221
+ id: "motion-graphics/success-check",
222
+ name: "Success Check",
223
+ description: "Checkmark that draws on inside a popping ring.",
224
+ group: "UI & Icons",
225
+ data: {
226
+ engine: "lottie",
227
+ aspectRatio: "1:1",
228
+ durationSeconds: 2,
229
+ backgroundColor: "#00000000",
230
+ motionPrompt:
231
+ "A satisfying success confirmation centered in frame. A circular ring (stroked in the ring color) scales in from about 0 with a crisp overshoot and settles over the first 12 frames. The moment it lands, a checkmark drawn as a single stroked path (in the stroke color) draws on left-to-right via an animated trim path from 0% to 100% over about 10 frames, with a slight ease-out so the tick snaps confidently at the end. Add a single soft pulse on the ring as the check completes (a brief scale to ~105% and back). Hold the finished mark, then fade the whole group out completing 8 frames before the end so it doesn't pop off. Easing: overshoot on the ring, ease-out on the trim. Palette: a positive accent on both the ring and the check. Transparent background — overlays a UI, no backdrop. One-shot, not looped. Expose slots: strokeColor, ringColor.",
232
+ },
233
+ },
234
+ {
235
+ id: "motion-graphics/error-cross",
236
+ name: "Error Cross",
237
+ description: "Error X that draws on inside a shaking ring.",
238
+ group: "UI & Icons",
239
+ data: {
240
+ engine: "lottie",
241
+ aspectRatio: "1:1",
242
+ durationSeconds: 2,
243
+ backgroundColor: "#00000000",
244
+ motionPrompt:
245
+ "A clear error indicator centered in frame. A circular ring (stroked in the ring color) scales in with overshoot over the first 12 frames. Then an X drawn as two stroked paths (in the stroke color) draws on in quick succession via animated trim paths — the first stroke over about 6 frames, the second starting 3 frames later — each easing out so they land decisively. As the X completes, give the whole group a short, sharp horizontal shake (a damped left-right wobble over ~8 frames) to signal failure, then settle. Hold the finished mark, then fade out completing 8 frames before the end. Easing: overshoot on the ring, ease-out on the strokes, a quick damped shake on the lockup. Palette: an alert accent on both the ring and the cross. Transparent background — overlays a UI, no backdrop. One-shot, not looped. Expose slots: strokeColor, ringColor.",
246
+ },
247
+ },
248
+ {
249
+ id: "motion-graphics/progress-bar",
250
+ name: "Progress Bar",
251
+ description: "Horizontal progress bar that fills with an editable label.",
252
+ group: "UI & Icons",
253
+ data: {
254
+ engine: "lottie",
255
+ aspectRatio: "16:9",
256
+ durationSeconds: 4,
257
+ backgroundColor: "#00000000",
258
+ motionPrompt:
259
+ "A horizontal progress bar centered in frame. A rounded track (filled with the track color) fades in first; then a fill bar (the bar color) grows from left to right inside it — animate the fill rectangle's width (or use a left-anchored scale on x) from 0 to full over about 60 frames with an ease-in-out so it accelerates then eases to completion. A short label sits above or beside the track in bold white and fades in as the fill starts. Optionally let a soft highlight sweep along the fill as it grows. When the bar reaches full, give it a small confirming pulse, hold, then fade the whole group out completing 16 frames before the end. Easing: ease-in-out on the fill, ease-out on the label. Palette: a muted track color and one saturated bar color, plus white text. Transparent background — overlays a UI, no backdrop. One-shot, not looped. Use the placeholder label \"Loading…\". Expose slots: barColor, trackColor, labelText.",
260
+ },
261
+ },
262
+ {
263
+ id: "motion-graphics/notification-pop",
264
+ name: "Notification Pop",
265
+ description: "Toast notification card that slides in with title and body.",
266
+ group: "UI & Icons",
267
+ data: {
268
+ engine: "lottie",
269
+ aspectRatio: "16:9",
270
+ durationSeconds: 3,
271
+ backgroundColor: "#00000000",
272
+ motionPrompt:
273
+ "A toast notification card that slides into the top-right corner. A rounded rectangle card (filled with the card color) springs in from above-right with anticipation and overshoot, settling over about 12 frames. A small accent dot or icon pops in on the left of the card, then the title text fades and slides in 4 frames behind in bold white, with the body line following 6 frames later in lighter gray. Keep the card crisp and clean — a subtle drop of opacity from the bg color is fine, but no heavy effects. Hold the toast for the middle of the timeline, then slide it back out up-and-right with a fade completing 14 frames before the end. Easing: overshoot on the card entrance, ease-out on the text. Palette: a card color, white title, gray body, and one small accent. Transparent background — overlays a UI, no backdrop. One-shot, not looped. Use the placeholder title \"New message\" and body \"You have 1 unread notification\". Expose slots: cardColor, titleText, bodyText.",
274
+ },
275
+ },
276
+
277
+ // ── FX Overlays ───────────────────────────────────────────────────────────
278
+ {
279
+ id: "motion-graphics/confetti-burst",
280
+ name: "Confetti Burst",
281
+ description: "Celebratory confetti burst overlay in four colors.",
282
+ group: "FX Overlays",
283
+ data: {
284
+ engine: "lottie",
285
+ aspectRatio: "16:9",
286
+ durationSeconds: 4,
287
+ backgroundColor: "#00000000",
288
+ motionPrompt:
289
+ "A celebratory confetti burst that overlays footage. Small vector confetti pieces erupt from a point near the lower-center, fountaining up and outward then drifting down under a gentle gravity-like ease, tumbling slowly and fading out as they fall so the frame clears by the end. Build it compactly: author ONE small group-wrapped rectangle or ellipse per color — colorA, colorB, colorC, colorD — and multiply each with a repeater (8–14 copies, with per-copy position/rotation offsets in the repeater's own transform so the copies fan out instead of stacking). Stagger the four groups' launch a few frames apart for an organic burst — never author individual confetti pieces. KEEP THE JSON COMPACT: at most 4 shape layers and 3–4 keyframes per animated property. Linear-ish motion on launch easing into a soft fall. Transparent background — overlays footage, so add no backdrop. One-shot, not looped: the burst plays once and fully clears before the out point. Expose slots: colorA, colorB, colorC, colorD.",
290
+ },
291
+ },
292
+ {
293
+ id: "motion-graphics/sparkle-shimmer",
294
+ name: "Sparkle Shimmer",
295
+ description: "Looping sparkle twinkles for a magical overlay.",
296
+ group: "FX Overlays",
297
+ data: {
298
+ engine: "lottie",
299
+ aspectRatio: "16:9",
300
+ durationSeconds: 4,
301
+ backgroundColor: "#00000000",
302
+ motionPrompt:
303
+ "A gentle, looping sparkle shimmer that overlays footage. Scatter a dozen or so four-point star sparkles (vector star/polygon paths or thin crossed strokes, group-wrapped) across the frame at varied sizes. Each sparkle twinkles by scaling up from 0 and back down while its opacity rises and falls, on its own offset cycle so the field shimmers continuously rather than pulsing in unison — stagger their phase across the timeline. Add a slow, subtle rotation to a few for life. Keep every sparkle the sparkle color (let opacity and scale carry the variation). Use a repeater or a compact set of groups to stay under the layer budget. Soft ease-in-out on each twinkle. Transparent background — overlays footage, so add no backdrop. Seamless loop — every sparkle's last keyframe returns exactly to its first so the shimmer repeats without a seam. Expose slots: sparkleColor.",
304
+ },
305
+ },
306
+ {
307
+ id: "motion-graphics/speed-lines",
308
+ name: "Speed Lines",
309
+ description: "Anime-style speed lines whooshing across the frame.",
310
+ group: "FX Overlays",
311
+ data: {
312
+ engine: "lottie",
313
+ aspectRatio: "16:9",
314
+ durationSeconds: 2,
315
+ backgroundColor: "#00000000",
316
+ motionPrompt:
317
+ "A short, high-energy burst of anime-style speed lines that overlays footage. Author a set of thin horizontal streaks (narrow tapered rectangles or stroked paths, group-wrapped) at varied vertical positions and lengths; whoosh them across the frame left-to-right (or converging toward center) with a fast linear motion, staggered 1–2 frames apart over the first 10 frames so they read as a rushing swarm. Each line fades in as it enters and fades out as it exits so none lingers. Keep them all the line color and lean on length, position and timing for variety; use a repeater to multiply streaks and stay well under the layer budget. Fast, mechanical linear motion — no easing — for impact. Transparent background — overlays footage, so add no backdrop. One-shot, not looped: the whoosh fires once and clears before the out point. Expose slots: lineColor.",
318
+ },
319
+ },
320
+
321
+ // ── Backgrounds ───────────────────────────────────────────────────────────
322
+ {
323
+ id: "motion-graphics/gradient-blob-loop",
324
+ name: "Gradient Blob Loop",
325
+ description: "Slow morphing gradient blobs for a looping backdrop.",
326
+ group: "Backgrounds",
327
+ data: {
328
+ engine: "lottie",
329
+ aspectRatio: "16:9",
330
+ durationSeconds: 8,
331
+ backgroundColor: "#0a0a12",
332
+ motionPrompt:
333
+ "A calm, full-frame animated backdrop of slow-morphing gradient blobs, designed to loop forever behind other content. Place two or three large soft organic blobs (big group-wrapped ellipses or gradient-filled paths) using colorA and colorB, drifting slowly across the frame on gentle looping paths and breathing in scale, so the color softly shifts and overlaps over the full eight seconds. Keep the motion unhurried and continuous with smooth ease-in-out, never sharp. Because this is a standalone backdrop, fill the frame edge-to-edge with the dark opaque base and let the blobs float over it — this preset is allowed a full-frame background. Seamless loop — every blob's position, scale and any gradient stop returns exactly to its starting value on the last frame so the eight-second cycle repeats with no visible seam. Palette: two accent colors blending over the dark base. Expose slots: colorA, colorB.",
334
+ },
335
+ },
336
+ {
337
+ id: "motion-graphics/geometric-pattern-loop",
338
+ name: "Geometric Pattern Loop",
339
+ description: "Tiling geometric shapes animating in a seamless loop.",
340
+ group: "Backgrounds",
341
+ data: {
342
+ engine: "lottie",
343
+ aspectRatio: "16:9",
344
+ durationSeconds: 8,
345
+ backgroundColor: "#0b0b0b",
346
+ motionPrompt:
347
+ "A full-frame geometric pattern backdrop that loops forever behind other content. Tile a grid of simple shapes (circles, triangles or diamonds — group-wrapped) in the shape color across the dark backdrop color, and animate the field with a traveling wave: each shape scales, rotates or fades on an offset tied to its grid position so a smooth ripple moves diagonally across the frame and wraps continuously. Use a repeater or a compact grid of groups to build the tiling while staying under the 50-layer budget — do not author every cell as its own layer. Keep the motion calm and hypnotic with ease-in-out. Because this is a standalone backdrop, fill the frame with the opaque backdrop color — this preset is allowed a full-frame background. Seamless loop — the wave's phase returns exactly to its start on the last frame so the eight-second cycle repeats with no seam or jump. Palette: one shape color over the dark backdrop color. Expose slots: shapeColor, backdropColor.",
348
+ },
349
+ },
350
+ ]