@adminide-stack/yantra-mobile 12.0.121 → 12.0.123-alpha.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 (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +4 -4
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,4 +1,6 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useEffect}from'react';import {StyleSheet,View,ScrollView,Pressable,Text,Image,TextInput,ActivityIndicator}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {resultUrl,friendlyMediaError,generationImageUrl,generationMediaUrl}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {STATIC_IMAGE_MODELS,normalizeModels,promptAudioModels,STATIC_VIDEO_MODELS,generationCapabilities,videoDurationOptions,buildVideoGenerateParams}from'./generationModels.js';import {DEFAULT_PROMO_PRESET,EMPTY_PROMO_CONTEXT,PROMO_PRESETS,PROMO_DURATIONS,PROMO_ASPECT_RATIOS,PROMO_PLAYBOOKS,designPromoProject,PROMO_CONNECTOR}from'./promoVideo.js';import {PromoContextFields}from'./PromoContextFields.js';import {startPromoTask}from'./canvasTasks.js';import {CLIP_COUNT_CHOICES,CLIP_ASPECT_RATIOS,CLIP_RESOLUTIONS,buildClipRunParams,parseClipRunResult}from'./videoClips.js';import {NativeDictationBar}from'../audio-input/NativeDictationBar.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {StyleSheet,View,ScrollView,Pressable,Text,TextInput,ActivityIndicator}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {resultUrl,friendlyMediaError,generationImageUrl,generationMediaUrl}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {STATIC_IMAGE_MODELS,normalizeModels,promptAudioModels,STATIC_VIDEO_MODELS,generationCapabilities,videoReferenceCap,modelThatReadsImages,videoDurationOptions,buildVideoGenerateParams}from'./generationModels.js';import {MAX_REFERENCE_IMAGES,PROMO_MAX_REFERENCES,addReference,imageLaneCall}from'./generatorReferences.js';import {modelForCommand,parseCommandLine,matchCommands,laneForCommand,findCommand,missingFor,MISSING_LABEL,VIDEO_INPUT_MODEL,commandPrompt}from'./generatorCommands.js';import {ReferenceStrip,StillRoleSwitch,FrameSlot}from'./GeneratorReferenceSlots.js';import {CanvasTemplatesPanel}from'./CanvasTemplatesPanel.js';import {nearestAspect}from'./studioLooks.js';import {ensureFetchableMediaUrls,ensureFetchableMediaUrl}from'./mediaUrls.js';import {DEFAULT_PROMO_PRESET,EMPTY_PROMO_CONTEXT,defaultPromoQuality,PROMO_PRESETS,PROMO_DURATIONS,PROMO_ASPECT_RATIOS,PROMO_PLAYBOOKS,lookupPromoPreset,designPromoProject,PROMO_CONNECTOR}from'./promoVideo.js';import {PromoContextFields,PromoProductionFields}from'./PromoContextFields.js';import {startPromoTask}from'./canvasTasks.js';import {CLIP_COUNT_CHOICES,CLIP_ASPECT_RATIOS,CLIP_RESOLUTIONS,buildClipRunParams,parseClipRunResult}from'./videoClips.js';import {NativeDictationBar}from'../audio-input/NativeDictationBar.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
2
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
6
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -14,6 +16,7 @@ var __spreadValues = (a, b) => {
14
16
  }
15
17
  return a;
16
18
  };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
17
20
  const ASPECTS = ["16:9", "9:16", "1:1"];
18
21
  const MODES = [{
19
22
  id: "image",
@@ -49,7 +52,8 @@ function CanvasGeneratePanel({
49
52
  onSlides,
50
53
  onGenerated,
51
54
  onPromoDesigned,
52
- onPromoQueued
55
+ onPromoQueued,
56
+ pickStill
53
57
  }) {
54
58
  const [mode, setMode] = useState("image");
55
59
  const [prompt, setPrompt] = useState("");
@@ -73,6 +77,22 @@ function CanvasGeneratePanel({
73
77
  const [clipRes, setClipRes] = useState("720");
74
78
  const [frameSec, setFrameSec] = useState(1);
75
79
  const [frameUrl, setFrameUrl] = useState(null);
80
+ const seedStill = (seedItem == null ? void 0 : seedItem.type) === "image" ? unwrapProxyUrl(seedItem.src) : null;
81
+ const [imageStills, setImageStills] = useState(seedStill ? [seedStill] : []);
82
+ const [stillRole, setStillRole] = useState("source");
83
+ const [startFrame, setStartFrame] = useState(seedStill);
84
+ const [endFrame, setEndFrame] = useState(null);
85
+ const [videoRefs, setVideoRefs] = useState([]);
86
+ const [picking, setPicking] = useState(null);
87
+ const [templatesOpen, setTemplatesOpen] = useState(false);
88
+ const [promoQuality, setPromoQuality] = useState(defaultPromoQuality(DEFAULT_PROMO_PRESET));
89
+ const [promoNarrator, setPromoNarrator] = useState("");
90
+ const [promoUseCases, setPromoUseCases] = useState("");
91
+ const [promoDesignModel, setPromoDesignModel] = useState("");
92
+ const pendingCommand = useRef(null);
93
+ useEffect(() => {
94
+ if (frameUrl) setStartFrame(frameUrl);
95
+ }, [frameUrl]);
76
96
  useEffect(() => {
77
97
  if (!(lookSeed == null ? void 0 : lookSeed.prompt)) return;
78
98
  setMode("video");
@@ -104,14 +124,16 @@ function CanvasGeneratePanel({
104
124
  let cancelled = false;
105
125
  const job = mode === "image" ? runAction("yantra-image-generation", "YANTRA_GEMINI_IMAGE_LIST_MODELS", {}) : mode === "audio" ? runAction("yantra-audio", "YANTRA_AUDIO_LIST_MODELS", {}) : runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_LIST_MODELS", {});
106
126
  job.then((result) => {
107
- var _a, _b;
127
+ var _a, _b, _c, _d;
108
128
  if (cancelled) return;
109
129
  let list = normalizeModels(result);
110
130
  if (mode === "audio") list = promptAudioModels(list);
111
131
  if (mode === "video" && list.length === 0) list = STATIC_VIDEO_MODELS;
112
132
  if (mode === "image" && list.length === 0) list = STATIC_IMAGE_MODELS;
113
133
  setModels(list);
114
- setSelectedModel((_b = (_a = list[0]) == null ? void 0 : _a.id) != null ? _b : "");
134
+ const cmd = pendingCommand.current;
135
+ pendingCommand.current = null;
136
+ setSelectedModel(cmd ? modelForCommand(cmd, list, (_b = (_a = list[0]) == null ? void 0 : _a.id) != null ? _b : "") : (_d = (_c = list[0]) == null ? void 0 : _c.id) != null ? _d : "");
115
137
  }).catch(() => {
116
138
  if (cancelled) return;
117
139
  if (mode === "video") {
@@ -128,11 +150,59 @@ function CanvasGeneratePanel({
128
150
  }, [mode, runAction]);
129
151
  const modelInfo = models.find((m) => m.id === selectedModel);
130
152
  const videoCaps = generationCapabilities(modelInfo);
153
+ const refCap = videoReferenceCap(models, selectedModel);
154
+ const footageSrc = (seedItem == null ? void 0 : seedItem.type) === "video" ? unwrapProxyUrl(seedItem.src) : void 0;
155
+ const hasStill = mode === "image" ? imageStills.length > 0 : Boolean(startFrame || imageStills[0]);
156
+ const commandLine = parseCommandLine(prompt);
157
+ const commandSuggestions = (commandLine == null ? void 0 : commandLine.typing) && (mode === "image" || mode === "video") ? matchCommands(commandLine.token) : [];
158
+ useEffect(() => {
159
+ const attached = mode === "image" ? imageStills.length > 0 : mode === "video" && Boolean(startFrame);
160
+ if (!attached) return;
161
+ const alt = modelThatReadsImages(models, selectedModel);
162
+ if (alt) setSelectedModel(alt);
163
+ }, [mode, imageStills.length, startFrame, models, selectedModel]);
164
+ const switchMode = (id) => {
165
+ setMode(id);
166
+ setShowModels(false);
167
+ if (id === "image") {
168
+ setAspect("16:9");
169
+ setModels(STATIC_IMAGE_MODELS);
170
+ setSelectedModel(STATIC_IMAGE_MODELS[0].id);
171
+ } else if (id === "video") {
172
+ setAspect("16:9");
173
+ setModels(STATIC_VIDEO_MODELS);
174
+ setSelectedModel(STATIC_VIDEO_MODELS[0].id);
175
+ }
176
+ };
177
+ const applyCommand = (cmd) => {
178
+ setPrompt(`/${cmd.id} `);
179
+ const lane = laneForCommand(cmd, {
180
+ footage: Boolean(footageSrc)
181
+ });
182
+ if (lane !== mode) {
183
+ pendingCommand.current = cmd;
184
+ switchMode(lane);
185
+ } else {
186
+ setSelectedModel(modelForCommand(cmd, models, selectedModel));
187
+ }
188
+ };
189
+ const pickInto = (target) => pickStill ? (source) => {
190
+ setPicking(target);
191
+ pickStill(target, source).then((url) => {
192
+ if (!url) return;
193
+ const clean = unwrapProxyUrl(url);
194
+ if (target === "reference") setImageStills((p) => addReference(p, clean, MAX_REFERENCE_IMAGES));
195
+ else if (target === "startFrame") setStartFrame(clean);
196
+ else if (target === "endFrame") setEndFrame(clean);
197
+ else if (target === "videoReference") setVideoRefs((p) => addReference(p, clean, refCap));
198
+ else setPromoRefs((p) => addReference(p, clean, PROMO_MAX_REFERENCES));
199
+ }).catch((err) => setNotice(err instanceof Error ? err.message : "Could not add that image")).finally(() => setPicking(null));
200
+ } : void 0;
131
201
  const aspectChoices = mode === "video" ? videoCaps.aspects : [...ASPECTS];
132
202
  const durations = mode === "video" ? videoDurationOptions(modelInfo) : [];
133
203
  const noun = mode === "promo" ? "marketing video" : mode === "slides" ? "slides" : mode;
134
204
  const generate = () => {
135
- var _a;
205
+ var _a, _b;
136
206
  if (mode === "slides") {
137
207
  onSlides();
138
208
  return;
@@ -162,53 +232,91 @@ function CanvasGeneratePanel({
162
232
  }).catch((err) => setNotice(friendlyMediaError(err, "video clips"))).finally(() => setBusy(false));
163
233
  return;
164
234
  }
165
- const text = prompt.trim();
166
- if (!text || busy) return;
235
+ const raw = prompt.trim();
236
+ if (!raw || busy) return;
237
+ const cmd = mode === "image" || mode === "video" ? findCommand(raw) : void 0;
238
+ let model = selectedModel || void 0;
239
+ if (cmd) {
240
+ const has = {
241
+ still: hasStill,
242
+ footage: Boolean(footageSrc)
243
+ };
244
+ const lane = laneForCommand(cmd, has);
245
+ if (lane !== mode) {
246
+ pendingCommand.current = cmd;
247
+ switchMode(lane);
248
+ setNotice(`Switched to ${lane} for ${cmd.label} \u2014 check the inputs and press Generate.`);
249
+ return;
250
+ }
251
+ const missing = missingFor(cmd, lane, has);
252
+ if (missing) {
253
+ setNotice(`${cmd.label} needs ${MISSING_LABEL[missing]}`);
254
+ return;
255
+ }
256
+ model = has.footage && lane === "video" ? (_b = (_a = models.find((m) => m.supportsVideoInput)) == null ? void 0 : _a.id) != null ? _b : VIDEO_INPUT_MODEL : modelForCommand(cmd, models, selectedModel);
257
+ }
258
+ const text = cmd ? commandPrompt(raw) : raw;
167
259
  setBusy(true);
168
260
  setNotice(null);
169
- const referenceImageUrl = (seedItem == null ? void 0 : seedItem.type) === "image" || mode === "video" && (seedItem == null ? void 0 : seedItem.type) === "video" && !restyle ? void 0 : (seedItem == null ? void 0 : seedItem.type) === "image" ? unwrapProxyUrl(seedItem.src) : void 0;
170
- const still = (seedItem == null ? void 0 : seedItem.type) === "image" ? unwrapProxyUrl(seedItem.src) : void 0;
171
- const footage = restyle && (seedItem == null ? void 0 : seedItem.type) === "video" ? unwrapProxyUrl(seedItem.src) : void 0;
172
- const job = mode === "image" ? runAction("yantra-image-generation", "YANTRA_GEMINI_IMAGE_GENERATE", __spreadValues({
261
+ const footage = mode === "video" && footageSrc && (restyle || cmd && cmd.needs !== "image") ? footageSrc : void 0;
262
+ const promoRequest = __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
173
263
  prompt: text,
264
+ preset: promoPreset,
265
+ durationSeconds: promoDuration,
174
266
  aspectRatio: aspect
175
- }, selectedModel ? {
176
- model: selectedModel
177
- } : {})).then((result) => generationImageUrl(result)) : mode === "audio" ? runAction("yantra-audio", "YANTRA_AUDIO_RUN_PROMPT", __spreadValues({
267
+ }, promoRefs.length ? {
268
+ referenceImageUrls: promoRefs
269
+ } : {}), footageSrc ? {
270
+ sourceVideoUrl: footageSrc
271
+ } : {}), promoLogoUrl ? {
272
+ logoUrl: promoLogoUrl
273
+ } : {}), promoContext), promoPlaybook ? {
274
+ stylePlaybook: promoPlaybook
275
+ } : {});
276
+ const job = mode === "image" ? (async () => {
277
+ const stills = await ensureFetchableMediaUrls(runAction, imageStills);
278
+ const call = imageLaneCall({
279
+ prompt: text,
280
+ aspectRatio: aspect,
281
+ model,
282
+ stills,
283
+ role: cmd ? "source" : stillRole
284
+ });
285
+ return generationImageUrl(await runAction("yantra-image-generation", call.action, call.params));
286
+ })() : mode === "audio" ? runAction("yantra-audio", "YANTRA_AUDIO_RUN_PROMPT", __spreadValues({
178
287
  prompt: text
179
- }, selectedModel ? {
180
- model: selectedModel
288
+ }, model ? {
289
+ model
181
290
  } : {})).then((result) => resultUrl(result, "YANTRA_AUDIO_RUN_PROMPT")) : mode === "promo" ? startPromoTask(runAction, {
182
291
  boardId: boardId || "global",
183
292
  brief: text,
184
- request: __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
185
- prompt: text,
186
- preset: promoPreset,
187
- durationSeconds: promoDuration,
188
- aspectRatio: aspect
189
- }, promoRefs.length ? {
190
- referenceImageUrls: promoRefs
191
- } : still ? {
192
- referenceImageUrls: [still]
193
- } : {}), (seedItem == null ? void 0 : seedItem.type) === "video" ? {
194
- sourceVideoUrl: unwrapProxyUrl(seedItem.src)
195
- } : {}), promoLogoUrl ? {
196
- logoUrl: promoLogoUrl
197
- } : {}), promoContext), promoPlaybook ? {
198
- stylePlaybook: promoPlaybook
293
+ request: __spreadValues(__spreadValues(__spreadProps(__spreadValues({}, promoRequest), {
294
+ quality: promoQuality
295
+ }), promoNarrator ? {
296
+ narratorVoice: promoNarrator
297
+ } : {}), promoUseCases.trim() ? {
298
+ useCases: promoUseCases
199
299
  } : {})
200
300
  }).then(() => {
201
301
  onPromoQueued == null ? void 0 : onPromoQueued();
202
302
  setNotice("Production queued \u2014 track it under More \u2192 Tasks");
203
303
  return "";
204
- }) : runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
205
- prompt: text,
206
- aspectRatio: aspect,
207
- model: selectedModel || void 0,
208
- durationSeconds: videoDuration || void 0,
209
- referenceImageUrl: (_a = frameUrl != null ? frameUrl : still) != null ? _a : referenceImageUrl,
210
- referenceVideoUrl: footage
211
- })).then((result) => generationMediaUrl(result));
304
+ }) : (async () => {
305
+ const first = startFrame && !footage && videoCaps.canStartFrame ? await ensureFetchableMediaUrl(runAction, startFrame) : void 0;
306
+ const last = endFrame && videoCaps.canEndFrame ? await ensureFetchableMediaUrl(runAction, endFrame) : void 0;
307
+ const refs = await ensureFetchableMediaUrls(runAction, videoRefs.slice(0, refCap));
308
+ const result = await runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
309
+ prompt: text,
310
+ aspectRatio: aspect,
311
+ model,
312
+ durationSeconds: videoDuration || void 0,
313
+ referenceImageUrl: first,
314
+ referenceEndImageUrl: last,
315
+ styleReferenceUrls: refs,
316
+ referenceVideoUrl: footage
317
+ }));
318
+ return generationMediaUrl(result);
319
+ })();
212
320
  job.then((url) => {
213
321
  if (url) onGenerated(url, {
214
322
  prompt: text,
@@ -224,19 +332,7 @@ function CanvasGeneratePanel({
224
332
  /* @__PURE__ */ jsxs(ScrollView, { keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.body, children: [
225
333
  /* @__PURE__ */ jsx(View, { style: styles.tabs, children: MODES.map((tab) => {
226
334
  const on = mode === tab.id;
227
- return /* @__PURE__ */ jsxs(Pressable, { onPress: () => {
228
- setMode(tab.id);
229
- setShowModels(false);
230
- if (tab.id === "image") {
231
- setAspect("16:9");
232
- setModels(STATIC_IMAGE_MODELS);
233
- setSelectedModel(STATIC_IMAGE_MODELS[0].id);
234
- } else if (tab.id === "video") {
235
- setAspect("16:9");
236
- setModels(STATIC_VIDEO_MODELS);
237
- setSelectedModel(STATIC_VIDEO_MODELS[0].id);
238
- }
239
- }, style: [styles.tab, on && styles.tabOn], children: [
335
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: () => switchMode(tab.id), style: [styles.tab, on && styles.tabOn], children: [
240
336
  on ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: tab.icon, size: 14, color: "#9a3412" }) : null,
241
337
  /* @__PURE__ */ jsx(Text, { style: [styles.tabLabel, on && styles.tabLabelOn], children: tab.label })
242
338
  ] }, tab.id);
@@ -247,9 +343,6 @@ function CanvasGeneratePanel({
247
343
  frameSec.toFixed(1),
248
344
  "s"
249
345
  ] }),
250
- frameUrl ? /* @__PURE__ */ jsx(Image, { source: {
251
- uri: frameUrl
252
- }, style: styles.framePreview }) : null,
253
346
  /* @__PURE__ */ jsx(View, { style: styles.pills, children: [0.5, 1, 2, 3, 5].map((sec) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setFrameSec(sec), style: [styles.pill, frameSec === sec && styles.pillOn], children: /* @__PURE__ */ jsxs(Text, { style: styles.pillLabel, children: [
254
347
  sec,
255
348
  "s"
@@ -276,7 +369,30 @@ function CanvasGeneratePanel({
276
369
  }, style: styles.pill, children: [
277
370
  /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "clock-outline", size: 14, color: "#64748b" }),
278
371
  /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: videoDuration ? `${videoDuration}s` : "Auto" })
279
- ] }) : null
372
+ ] }) : null,
373
+ /* @__PURE__ */ jsxs(Pressable, { onPress: () => setTemplatesOpen((v) => !v), style: [styles.pill, templatesOpen && styles.pillOn], accessibilityRole: "button", accessibilityLabel: "Browse prompt templates", children: [
374
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "view-grid-outline", size: 14, color: "#64748b" }),
375
+ /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: "Templates" })
376
+ ] })
377
+ ] }) : null,
378
+ templatesOpen && (mode === "image" || mode === "video" || mode === "audio") ? /* @__PURE__ */ jsx(CanvasTemplatesPanel, { open: true, runAction, defaultLane: mode, onPick: (template) => {
379
+ if (template.kind !== mode) switchMode(template.kind);
380
+ const fit = template.kind === "video" && template.aspect ? nearestAspect(template.aspect, ["16:9", "9:16"]) : void 0;
381
+ if (fit) setAspect(fit);
382
+ setPrompt(template.prompt || template.description || template.title);
383
+ setTemplatesOpen(false);
384
+ } }) : null,
385
+ mode === "image" ? /* @__PURE__ */ jsxs(View, { style: styles.refBlock, children: [
386
+ /* @__PURE__ */ jsx(ReferenceStrip, { label: "Images", hint: "Attach a still to edit it, or to guide a new image", urls: imageStills, cap: MAX_REFERENCE_IMAGES, busy: picking === "reference", onPick: pickInto("reference"), onRemove: (url) => setImageStills((p) => p.filter((u) => u !== url)) }),
387
+ imageStills.length > 0 ? /* @__PURE__ */ jsx(StillRoleSwitch, { value: stillRole, onChange: setStillRole }) : null
388
+ ] }) : null,
389
+ mode === "video" && !(restyle && footageSrc) ? /* @__PURE__ */ jsxs(View, { style: styles.refBlock, children: [
390
+ /* @__PURE__ */ jsx(Text, { style: styles.rowLabel, children: "Reference" }),
391
+ /* @__PURE__ */ jsxs(View, { style: styles.slotRow, children: [
392
+ videoCaps.canStartFrame ? /* @__PURE__ */ jsx(FrameSlot, { label: "First frame", dot: "#10b981", url: startFrame, busy: picking === "startFrame", onPick: pickInto("startFrame"), onClear: () => setStartFrame(null) }) : null,
393
+ videoCaps.canEndFrame ? /* @__PURE__ */ jsx(FrameSlot, { label: "Last frame", dot: "#f43f5e", url: endFrame, busy: picking === "endFrame", onPick: pickInto("endFrame"), onClear: () => setEndFrame(null) }) : null
394
+ ] }),
395
+ /* @__PURE__ */ jsx(ReferenceStrip, { label: "Other references", hint: "Keep a look, character or product \u2014 without opening on it", urls: videoRefs.slice(0, refCap), cap: refCap, busy: picking === "videoReference", onPick: pickInto("videoReference"), onRemove: (url) => setVideoRefs((p) => p.filter((u) => u !== url)) })
280
396
  ] }) : null,
281
397
  showModels && models.length > 0 ? /* @__PURE__ */ jsx(View, { style: styles.menu, children: models.map((m) => /* @__PURE__ */ jsx(Pressable, { onPress: () => {
282
398
  setSelectedModel(m.id);
@@ -285,6 +401,7 @@ function CanvasGeneratePanel({
285
401
  mode === "promo" ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.hScroll, contentContainerStyle: styles.pills, children: PROMO_PRESETS.map((p) => /* @__PURE__ */ jsx(Pressable, { onPress: () => {
286
402
  setPromoPreset(p.id);
287
403
  setPromoDuration(p.defaultDurationSeconds);
404
+ setPromoQuality(defaultPromoQuality(p.id));
288
405
  }, style: [styles.pill, promoPreset === p.id && styles.pillOn], children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: p.name }) }, p.id)) }) : null,
289
406
  mode === "promo" ? /* @__PURE__ */ jsxs(View, { style: styles.pills, children: [
290
407
  PROMO_DURATIONS.map((s) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setPromoDuration(s), style: [styles.pill, promoDuration === s && styles.pillOn], children: /* @__PURE__ */ jsxs(Text, { style: styles.pillLabel, children: [
@@ -295,6 +412,11 @@ function CanvasGeneratePanel({
295
412
  ] }) : null,
296
413
  mode === "promo" ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.hScroll, contentContainerStyle: styles.pills, children: PROMO_PLAYBOOKS.map((p) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setPromoPlaybook(p.id), style: [styles.pill, promoPlaybook === p.id && styles.pillOn], children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: p.name }) }, p.id || "default")) }) : null,
297
414
  mode === "promo" ? /* @__PURE__ */ jsx(PromoContextFields, { value: promoContext, onChange: (patch) => setPromoContext((prev) => __spreadValues(__spreadValues({}, prev), patch)), logoUrl: promoLogoUrl, onPickLogo: (seedItem == null ? void 0 : seedItem.type) === "image" ? () => setPromoLogoUrl(unwrapProxyUrl(seedItem.src)) : void 0, onClearLogo: () => setPromoLogoUrl(null) }) : null,
415
+ mode === "promo" ? /* @__PURE__ */ jsx(ReferenceStrip, { label: "Reference images", hint: "Product shots or stills the promo should feature", urls: promoRefs, cap: PROMO_MAX_REFERENCES, busy: picking === "promoReference", onPick: pickInto("promoReference"), onRemove: (url) => setPromoRefs((p) => p.filter((u) => u !== url)) }) : null,
416
+ mode === "promo" ? /* @__PURE__ */ jsx(PromoProductionFields, __spreadValues({ quality: promoQuality, onQuality: setPromoQuality, narrator: promoNarrator, onNarrator: setPromoNarrator, useCases: promoUseCases, onUseCases: setPromoUseCases }, onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? {
417
+ designModel: promoDesignModel,
418
+ onDesignModel: setPromoDesignModel
419
+ } : {})) : null,
298
420
  mode === "clips" ? /* @__PURE__ */ jsxs(Fragment, { children: [
299
421
  /* @__PURE__ */ jsx(TextInput, { value: clipUrl, onChangeText: setClipUrl, placeholder: "Paste a video URL\u2026", placeholderTextColor: "#94a3b8", autoCapitalize: "none", style: styles.field }),
300
422
  /* @__PURE__ */ jsx(View, { style: styles.pills, children: CLIP_COUNT_CHOICES.map((n) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setClipCount(n), style: [styles.pill, clipCount === n && styles.pillOn], children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: n }) }, n)) }),
@@ -305,7 +427,16 @@ function CanvasGeneratePanel({
305
427
  "p"
306
428
  ] }) }, value))
307
429
  ] })
308
- ] }) : mode === "slides" ? /* @__PURE__ */ jsx(Text, { style: styles.hint, children: "Opens the slides studio \u2014 same as web Generate \u2192 Slides." }) : /* @__PURE__ */ jsx(TextInput, { value: prompt, onChangeText: setPrompt, placeholder, placeholderTextColor: "#94a3b8", multiline: true, style: styles.prompt })
430
+ ] }) : mode === "slides" ? /* @__PURE__ */ jsx(Text, { style: styles.hint, children: "Opens the slides studio \u2014 same as web Generate \u2192 Slides." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
431
+ /* @__PURE__ */ jsx(TextInput, { value: prompt, onChangeText: setPrompt, placeholder: mode === "image" || mode === "video" ? `${placeholder} Type / for effects` : placeholder, placeholderTextColor: "#94a3b8", multiline: true, style: styles.prompt }),
432
+ commandSuggestions.length > 0 ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, keyboardShouldPersistTaps: "handled", showsHorizontalScrollIndicator: false, style: styles.hScroll, contentContainerStyle: styles.pills, children: commandSuggestions.map((cmd) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => applyCommand(cmd), style: styles.pill, accessibilityRole: "button", accessibilityHint: cmd.blurb, children: [
433
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: cmd.icon, size: 14, color: "#9a3412" }),
434
+ /* @__PURE__ */ jsxs(Text, { style: styles.pillLabel, children: [
435
+ "/",
436
+ cmd.id
437
+ ] })
438
+ ] }, cmd.id)) }) : null
439
+ ] })
309
440
  ] }),
310
441
  notice ? /* @__PURE__ */ jsx(Text, { style: styles.notice, children: notice }) : null,
311
442
  /* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
@@ -315,13 +446,12 @@ function CanvasGeneratePanel({
315
446
  setDictating(false);
316
447
  setPrompt((prev) => (prev ? `${prev.trim()} ${text}` : text).trim());
317
448
  }, onCancel: () => setDictating(false), onFallback: () => setDictating(false) }) }) : /* @__PURE__ */ jsx(Pressable, { onPress: () => setDictating(true), style: styles.mic, accessibilityRole: "button", accessibilityLabel: "Dictate", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "microphone-outline", size: 20, color: "#64748b" }) }),
318
- mode === "promo" && onPromoDesigned ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
449
+ mode === "promo" && onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
319
450
  if (!runAction || busy || !prompt.trim()) return;
320
451
  setBusy(true);
321
452
  setNotice(null);
322
- const still = (seedItem == null ? void 0 : seedItem.type) === "image" ? unwrapProxyUrl(seedItem.src) : void 0;
323
- const refs = promoRefs.length ? promoRefs : still ? [still] : [];
324
- designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
453
+ const refs = promoRefs;
454
+ designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
325
455
  prompt: prompt.trim(),
326
456
  preset: promoPreset,
327
457
  durationSeconds: promoDuration,
@@ -334,6 +464,8 @@ function CanvasGeneratePanel({
334
464
  logoUrl: promoLogoUrl
335
465
  } : {}), promoContext), promoPlaybook ? {
336
466
  stylePlaybook: promoPlaybook
467
+ } : {}), promoDesignModel ? {
468
+ model: promoDesignModel
337
469
  } : {})).then((designed) => onPromoDesigned(designed)).catch((err) => setNotice(friendlyMediaError(err, "promo design"))).finally(() => setBusy(false));
338
470
  }, disabled: busy || !prompt.trim(), style: [styles.designCta, (busy || !prompt.trim()) && styles.ctaOff], accessibilityRole: "button", accessibilityLabel: "Design editable cut", children: /* @__PURE__ */ jsx(Text, { style: styles.designCtaLabel, children: "Design cut" }) }) : null,
339
471
  /* @__PURE__ */ jsx(Pressable, { onPress: generate, disabled: busy || !canGo && mode !== "slides", style: [styles.cta, (busy || !canGo && mode !== "slides") && styles.ctaOff], accessibilityRole: "button", children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { color: "#fff7ed" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -408,11 +540,17 @@ const styles = StyleSheet.create({
408
540
  frameBox: {
409
541
  gap: 8
410
542
  },
411
- framePreview: {
412
- width: "100%",
413
- height: 140,
414
- borderRadius: 12,
415
- backgroundColor: "#f1f5f9"
543
+ refBlock: {
544
+ gap: 8
545
+ },
546
+ slotRow: {
547
+ flexDirection: "row",
548
+ gap: 8
549
+ },
550
+ rowLabel: {
551
+ fontSize: 12,
552
+ fontWeight: "600",
553
+ color: "#334155"
416
554
  },
417
555
  menu: {
418
556
  borderWidth: 1,