@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.
- package/lib/features/apps/appArt.js +1 -1
- package/lib/features/apps/appArt.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +15 -11
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +266 -68
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +176 -0
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +325 -29
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +137 -61
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +33 -2
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +89 -11
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +55 -2
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +323 -13
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +1 -53
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +697 -506
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasAgentChat.js +125 -11
- package/lib/features/canvas/canvasAgentChat.js.map +1 -1
- package/lib/features/canvas/canvasCore.js +117 -12
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +148 -111
- package/lib/features/canvas/canvasEditOps.js.map +1 -1
- package/lib/features/canvas/canvasTaskSync.js +235 -0
- package/lib/features/canvas/canvasTaskSync.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +98 -11
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/createTiles.js +247 -0
- package/lib/features/canvas/createTiles.js.map +1 -0
- package/lib/features/canvas/deepLinks.js +83 -0
- package/lib/features/canvas/deepLinks.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +13 -1
- package/lib/features/canvas/frameExtract.js.map +1 -1
- package/lib/features/canvas/generationModels.js +36 -8
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generatorCommands.js +106 -0
- package/lib/features/canvas/generatorCommands.js.map +1 -0
- package/lib/features/canvas/generatorReferences.js +82 -0
- package/lib/features/canvas/generatorReferences.js.map +1 -0
- package/lib/features/canvas/homeWork.js +74 -0
- package/lib/features/canvas/homeWork.js.map +1 -0
- package/lib/features/canvas/linksRpc.js +130 -0
- package/lib/features/canvas/linksRpc.js.map +1 -0
- package/lib/features/canvas/mediaRecheck.js +176 -0
- package/lib/features/canvas/mediaRecheck.js.map +1 -0
- package/lib/features/canvas/mediaUrls.js +258 -0
- package/lib/features/canvas/mediaUrls.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/promoProjectImport.js +80 -13
- package/lib/features/canvas/promoProjectImport.js.map +1 -1
- package/lib/features/canvas/promoVideo.js +106 -15
- package/lib/features/canvas/promoVideo.js.map +1 -1
- package/lib/features/canvas/reframe.js +228 -0
- package/lib/features/canvas/reframe.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +697 -0
- package/lib/features/canvas/serverTasks.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +207 -28
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/prompt.js +66 -0
- package/lib/features/canvas/set/agent/prompt.js.map +1 -0
- package/lib/features/canvas/set/agent/setOps.js +203 -0
- package/lib/features/canvas/set/agent/setOps.js.map +1 -0
- package/lib/features/canvas/set/agent/setTurn.js +128 -0
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
- package/lib/features/canvas/set/agent/snapshot.js +43 -0
- package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
- package/lib/features/canvas/set/agent/tools.js +580 -0
- package/lib/features/canvas/set/agent/tools.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +43 -4
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/set/supplyLibrary.js +397 -0
- package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +113 -52
- package/lib/features/canvas/storageLibrary.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +15 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +1 -8
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
- package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
- package/lib/features/canvas/useMediaSource.js +84 -0
- package/lib/features/canvas/useMediaSource.js.map +1 -0
- package/lib/features/canvas/video3d.js +11 -10
- package/lib/features/canvas/video3d.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
- package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/blurBox.js +34 -0
- package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +56 -22
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
- package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +216 -0
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
- package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
- package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +8 -4
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codezenHandoff.js +108 -0
- package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/hooks/useChatApi.js +1 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/screens/CanvasBoard/index.js +12 -1
- package/lib/screens/CanvasBoard/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +3 -3
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/screens/WebBuilder/index.js +4 -2
- package/lib/screens/WebBuilder/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +29 -2
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
- /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
const FRAME_USES = {
|
|
2
|
+
"9:16": "Instagram, TikTok, YouTube Shorts",
|
|
3
|
+
"4:5": "Instagram, Facebook",
|
|
4
|
+
"1:1": "Instagram, Facebook, LinkedIn",
|
|
5
|
+
"16:9": "YouTube, LinkedIn, X"
|
|
6
|
+
};
|
|
7
|
+
const PLATFORM_FORMATS = [{
|
|
8
|
+
id: "reel",
|
|
9
|
+
ratio: "9:16",
|
|
10
|
+
label: "Reel or Story",
|
|
11
|
+
uses: FRAME_USES["9:16"],
|
|
12
|
+
size: {
|
|
13
|
+
width: 1080,
|
|
14
|
+
height: 1920
|
|
15
|
+
}
|
|
16
|
+
}, {
|
|
17
|
+
id: "feed-post",
|
|
18
|
+
ratio: "4:5",
|
|
19
|
+
label: "Feed post",
|
|
20
|
+
uses: FRAME_USES["4:5"],
|
|
21
|
+
size: {
|
|
22
|
+
width: 1080,
|
|
23
|
+
height: 1350
|
|
24
|
+
}
|
|
25
|
+
}, {
|
|
26
|
+
id: "square-post",
|
|
27
|
+
ratio: "1:1",
|
|
28
|
+
label: "Square post",
|
|
29
|
+
uses: FRAME_USES["1:1"],
|
|
30
|
+
size: {
|
|
31
|
+
width: 1080,
|
|
32
|
+
height: 1080
|
|
33
|
+
}
|
|
34
|
+
}, {
|
|
35
|
+
id: "widescreen",
|
|
36
|
+
ratio: "16:9",
|
|
37
|
+
label: "Widescreen",
|
|
38
|
+
uses: FRAME_USES["16:9"],
|
|
39
|
+
size: {
|
|
40
|
+
width: 1920,
|
|
41
|
+
height: 1080
|
|
42
|
+
}
|
|
43
|
+
}];
|
|
44
|
+
const RATIO_FORMATS = [{
|
|
45
|
+
id: "4:3",
|
|
46
|
+
ratio: "4:3",
|
|
47
|
+
label: "Landscape",
|
|
48
|
+
uses: "Classic 4:3"
|
|
49
|
+
}, {
|
|
50
|
+
id: "3:4",
|
|
51
|
+
ratio: "3:4",
|
|
52
|
+
label: "Portrait",
|
|
53
|
+
uses: "Portrait 3:4"
|
|
54
|
+
}, {
|
|
55
|
+
id: "21:9",
|
|
56
|
+
ratio: "21:9",
|
|
57
|
+
label: "Cinema",
|
|
58
|
+
uses: "Ultrawide 21:9"
|
|
59
|
+
}];
|
|
60
|
+
const REFRAME_FORMATS = [...PLATFORM_FORMATS, ...RATIO_FORMATS];
|
|
61
|
+
const REFRAME_BARS = [{
|
|
62
|
+
id: "match",
|
|
63
|
+
label: "Match",
|
|
64
|
+
title: "The picture's own backdrop, carried on into the bars, so it reads as one tall frame"
|
|
65
|
+
}, {
|
|
66
|
+
id: "blur",
|
|
67
|
+
label: "Blur",
|
|
68
|
+
title: "A blurred, darkened copy of the picture"
|
|
69
|
+
}, {
|
|
70
|
+
id: "black",
|
|
71
|
+
label: "Black",
|
|
72
|
+
title: "Solid black bars"
|
|
73
|
+
}, {
|
|
74
|
+
id: "white",
|
|
75
|
+
label: "White",
|
|
76
|
+
title: "Solid white bars"
|
|
77
|
+
}];
|
|
78
|
+
function parseRatio(ratio) {
|
|
79
|
+
const [w, h] = ratio.split(":").map(Number);
|
|
80
|
+
if (!Number.isFinite(w) || !Number.isFinite(h) || !w || !h || w < 0 || h < 0) return null;
|
|
81
|
+
return w / h;
|
|
82
|
+
}
|
|
83
|
+
const evenDown = (n) => Math.max(2, Math.floor(n / 2) * 2);
|
|
84
|
+
const evenUp = (n) => Math.max(2, Math.ceil(n / 2) * 2);
|
|
85
|
+
function shapeAgainst(src, ratio) {
|
|
86
|
+
const target = parseRatio(ratio);
|
|
87
|
+
if (target === null || !(src.width > 0) || !(src.height > 0)) return "same";
|
|
88
|
+
const current = src.width / src.height;
|
|
89
|
+
if (Math.abs(current - target) <= target * 5e-3) return "same";
|
|
90
|
+
return current > target ? "wider" : "taller";
|
|
91
|
+
}
|
|
92
|
+
function reframePlan(src, ratio, fit, focus = 0.5) {
|
|
93
|
+
const target = parseRatio(ratio);
|
|
94
|
+
if (target === null || !(src.width > 0) || !(src.height > 0)) return null;
|
|
95
|
+
const current = src.width / src.height;
|
|
96
|
+
const along = Math.min(1, Math.max(0, focus));
|
|
97
|
+
if (fit === "crop") {
|
|
98
|
+
let width2 = src.width;
|
|
99
|
+
let height2 = src.height;
|
|
100
|
+
if (current > target) width2 = src.height * target;
|
|
101
|
+
else height2 = src.width / target;
|
|
102
|
+
width2 = Math.min(evenDown(Math.round(width2)), evenDown(src.width));
|
|
103
|
+
height2 = Math.min(evenDown(Math.round(height2)), evenDown(src.height));
|
|
104
|
+
return {
|
|
105
|
+
fit: "crop",
|
|
106
|
+
width: width2,
|
|
107
|
+
height: height2,
|
|
108
|
+
x: Math.floor((src.width - width2) * along),
|
|
109
|
+
y: Math.floor((src.height - height2) * along)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
let width = src.width;
|
|
113
|
+
let height = src.height;
|
|
114
|
+
if (current > target) height = src.width / target;
|
|
115
|
+
else width = src.height * target;
|
|
116
|
+
return {
|
|
117
|
+
fit: "fit",
|
|
118
|
+
width: evenUp(width),
|
|
119
|
+
height: evenUp(height)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function reframeOutput(format, plan) {
|
|
123
|
+
var _a;
|
|
124
|
+
return (_a = format.size) != null ? _a : {
|
|
125
|
+
width: plan.width,
|
|
126
|
+
height: plan.height
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function reframeClipParams(choice, src, out) {
|
|
130
|
+
const shape = shapeAgainst(src, choice.format.ratio);
|
|
131
|
+
const params = {
|
|
132
|
+
width: out.width,
|
|
133
|
+
height: out.height,
|
|
134
|
+
fit: choice.fit === "crop" ? "cover" : choice.fit === "stack" ? "stack" : "contain"
|
|
135
|
+
};
|
|
136
|
+
if (choice.fit === "stack") {
|
|
137
|
+
params.background = "auto";
|
|
138
|
+
return {
|
|
139
|
+
op: "reframe",
|
|
140
|
+
params
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (choice.fit === "crop") {
|
|
144
|
+
if (shape === "wider") params.focus_x = choice.focus;
|
|
145
|
+
if (shape === "taller") params.focus_y = choice.focus;
|
|
146
|
+
return {
|
|
147
|
+
op: "reframe",
|
|
148
|
+
params
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
switch (choice.bars) {
|
|
152
|
+
case "match":
|
|
153
|
+
params.background = "auto";
|
|
154
|
+
break;
|
|
155
|
+
case "blur":
|
|
156
|
+
params.background = "blur";
|
|
157
|
+
break;
|
|
158
|
+
case "black":
|
|
159
|
+
case "white":
|
|
160
|
+
Object.assign(params, {
|
|
161
|
+
background: "color",
|
|
162
|
+
color: choice.bars
|
|
163
|
+
});
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
op: "reframe",
|
|
168
|
+
params
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function focusName(shape, focus) {
|
|
172
|
+
const end = focus <= 0.25 ? 0 : focus >= 0.75 ? 2 : 1;
|
|
173
|
+
if (shape === "taller") return ["top", "centre", "bottom"][end];
|
|
174
|
+
return ["left", "centre", "right"][end];
|
|
175
|
+
}
|
|
176
|
+
const BARS_WORD = {
|
|
177
|
+
blur: "blurred",
|
|
178
|
+
black: "black",
|
|
179
|
+
white: "white"
|
|
180
|
+
};
|
|
181
|
+
function describeReframe(choice, src) {
|
|
182
|
+
const shape = shapeAgainst(src, choice.format.ratio);
|
|
183
|
+
if (shape === "same") return "resized, nothing cut";
|
|
184
|
+
if (choice.fit === "crop") return `cropped from the ${focusName(shape, choice.focus)}`;
|
|
185
|
+
if (choice.fit === "stack") return "rearranged for vertical";
|
|
186
|
+
const where = shape === "wider" ? "above and below" : "at the sides";
|
|
187
|
+
if (choice.bars === "match") return `fitted, its backdrop spread ${where}`;
|
|
188
|
+
return `fitted with ${BARS_WORD[choice.bars]} bars ${where}`;
|
|
189
|
+
}
|
|
190
|
+
function formatName(format) {
|
|
191
|
+
return format.size ? format.label : format.ratio;
|
|
192
|
+
}
|
|
193
|
+
function stillBars(choice) {
|
|
194
|
+
return choice.fit !== "stack" && choice.bars === "white" ? "white" : "black";
|
|
195
|
+
}
|
|
196
|
+
function stillReframeNote(choice) {
|
|
197
|
+
if (choice.fit === "crop") return null;
|
|
198
|
+
if (choice.fit === "stack") return "Stack is for clips; this still is fitted with black bars instead.";
|
|
199
|
+
if (choice.bars === "match" || choice.bars === "blur") {
|
|
200
|
+
return `${choice.bars === "match" ? "Match" : "Blur"} bars need a clip on the phone; this still gets black bars.`;
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
function reframeStillCall(choice, src) {
|
|
205
|
+
const fit = choice.fit === "crop" ? "crop" : "fit";
|
|
206
|
+
const plan = reframePlan(src, choice.format.ratio, fit, choice.focus);
|
|
207
|
+
if (!plan) return null;
|
|
208
|
+
if (plan.fit === "crop") {
|
|
209
|
+
return {
|
|
210
|
+
action: "YANTRA_IMAGE_EDIT_CROP",
|
|
211
|
+
params: {
|
|
212
|
+
x: plan.x,
|
|
213
|
+
y: plan.y,
|
|
214
|
+
width: plan.width,
|
|
215
|
+
height: plan.height
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const bars = stillBars(choice);
|
|
220
|
+
return {
|
|
221
|
+
action: "YANTRA_IMAGE_EDIT_PAD",
|
|
222
|
+
params: {
|
|
223
|
+
width: plan.width,
|
|
224
|
+
height: plan.height,
|
|
225
|
+
color: bars === "white" ? "#ffffff" : "#000000"
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}export{FRAME_USES,PLATFORM_FORMATS,RATIO_FORMATS,REFRAME_BARS,REFRAME_FORMATS,describeReframe,focusName,formatName,parseRatio,reframeClipParams,reframeOutput,reframePlan,reframeStillCall,shapeAgainst,stillBars,stillReframeNote};//# sourceMappingURL=reframe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reframe.js","sources":["../../../src/features/canvas/reframe.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `components/generator/reframe.ts` — a clip or\n * still re-cut for where it is going (platform destinations, not bare ratios).\n *\n * CROP keeps what fits, positioned along the cut edge by `focus`. FIT keeps\n * every pixel and fills the bars (match / blur / black / white). STACK\n * rebuilds a landscape explainer for a portrait frame (clips only).\n *\n * A clip renders in ONE `YANTRA_VIDEO_EDIT_REFRAME` pass (`reframeClipParams`).\n * Web draws stills in a browser canvas; RN has none, so `reframeStillCall`\n * maps a still onto the image connector: crop -> CROP, fit -> PAD, with\n * match/blur/stack falling back to a plain pad (and saying so).\n *\n * Dimensions are held even: yuv420p and an odd edge make ffmpeg refuse.\n */\n\nexport interface Dims {\n width: number;\n height: number;\n}\n\n/** Where each frame shape is used (web `utils/frameUses.ts`). */\nexport const FRAME_USES: Readonly<Record<string, string>> = {\n '9:16': 'Instagram, TikTok, YouTube Shorts',\n '4:5': 'Instagram, Facebook',\n '1:1': 'Instagram, Facebook, LinkedIn',\n '16:9': 'YouTube, LinkedIn, X',\n};\n\nexport interface ReframeFormat {\n id: string;\n ratio: string;\n label: string;\n uses: string;\n /** The upload size the platforms ask for. Absent for a plain ratio (keeps the source's scale). */\n size?: Dims;\n}\n\nexport const PLATFORM_FORMATS: readonly ReframeFormat[] = [\n {\n id: 'reel',\n ratio: '9:16',\n label: 'Reel or Story',\n uses: FRAME_USES['9:16']!,\n size: { width: 1080, height: 1920 },\n },\n {\n id: 'feed-post',\n ratio: '4:5',\n label: 'Feed post',\n uses: FRAME_USES['4:5']!,\n size: { width: 1080, height: 1350 },\n },\n {\n id: 'square-post',\n ratio: '1:1',\n label: 'Square post',\n uses: FRAME_USES['1:1']!,\n size: { width: 1080, height: 1080 },\n },\n {\n id: 'widescreen',\n ratio: '16:9',\n label: 'Widescreen',\n uses: FRAME_USES['16:9']!,\n size: { width: 1920, height: 1080 },\n },\n];\n\nexport const RATIO_FORMATS: readonly ReframeFormat[] = [\n { id: '4:3', ratio: '4:3', label: 'Landscape', uses: 'Classic 4:3' },\n { id: '3:4', ratio: '3:4', label: 'Portrait', uses: 'Portrait 3:4' },\n { id: '21:9', ratio: '21:9', label: 'Cinema', uses: 'Ultrawide 21:9' },\n];\n\nexport const REFRAME_FORMATS: readonly ReframeFormat[] = [...PLATFORM_FORMATS, ...RATIO_FORMATS];\n\n/** 'stack' rebuilds a landscape explainer for a portrait frame; it is sized like 'fit'. */\nexport type ReframeFit = 'crop' | 'fit' | 'stack';\n\nexport type ReframeBars = 'match' | 'blur' | 'black' | 'white';\n\nexport const REFRAME_BARS: readonly { id: ReframeBars; label: string; title: string }[] = [\n {\n id: 'match',\n label: 'Match',\n title: \"The picture's own backdrop, carried on into the bars, so it reads as one tall frame\",\n },\n { id: 'blur', label: 'Blur', title: 'A blurred, darkened copy of the picture' },\n { id: 'black', label: 'Black', title: 'Solid black bars' },\n { id: 'white', label: 'White', title: 'Solid white bars' },\n];\n\nexport interface ReframeChoice {\n format: ReframeFormat;\n fit: ReframeFit;\n bars: ReframeBars;\n /** 0..1 along the edge a crop cuts: 0 keeps the left or top, 1 the right or bottom. */\n focus: number;\n}\n\nexport type ReframePlan =\n | { fit: 'crop'; width: number; height: number; x: number; y: number }\n | { fit: 'fit'; width: number; height: number };\n\nexport function parseRatio(ratio: string): number | null {\n const [w, h] = ratio.split(':').map(Number);\n if (!Number.isFinite(w) || !Number.isFinite(h) || !w || !h || w < 0 || h < 0) return null;\n return w / h;\n}\n\nconst evenDown = (n: number) => Math.max(2, Math.floor(n / 2) * 2);\nconst evenUp = (n: number) => Math.max(2, Math.ceil(n / 2) * 2);\n\nexport function shapeAgainst(src: Dims, ratio: string): 'wider' | 'taller' | 'same' {\n const target = parseRatio(ratio);\n if (target === null || !(src.width > 0) || !(src.height > 0)) return 'same';\n const current = src.width / src.height;\n if (Math.abs(current - target) <= target * 0.005) return 'same';\n return current > target ? 'wider' : 'taller';\n}\n\n/** The new frame in the SOURCE's pixels: the crop rectangle, or the padded canvas. */\nexport function reframePlan(src: Dims, ratio: string, fit: ReframeFit, focus = 0.5): ReframePlan | null {\n const target = parseRatio(ratio);\n if (target === null || !(src.width > 0) || !(src.height > 0)) return null;\n const current = src.width / src.height;\n const along = Math.min(1, Math.max(0, focus));\n if (fit === 'crop') {\n let width = src.width;\n let height = src.height;\n if (current > target) width = src.height * target;\n else height = src.width / target;\n width = Math.min(evenDown(Math.round(width)), evenDown(src.width));\n height = Math.min(evenDown(Math.round(height)), evenDown(src.height));\n return {\n fit: 'crop',\n width,\n height,\n x: Math.floor((src.width - width) * along),\n y: Math.floor((src.height - height) * along),\n };\n }\n let width = src.width;\n let height = src.height;\n if (current > target) height = src.width / target;\n else width = src.height * target;\n return { fit: 'fit', width: evenUp(width), height: evenUp(height) };\n}\n\nexport function reframeOutput(format: ReframeFormat, plan: ReframePlan): Dims {\n return format.size ?? { width: plan.width, height: plan.height };\n}\n\nexport function alreadyReframed(src: Dims, format: ReframeFormat): boolean {\n if (format.size) return src.width === format.size.width && src.height === format.size.height;\n return shapeAgainst(src, format.ratio) === 'same';\n}\n\n/** The REFRAME op params that render a clip in one pass. */\nexport function reframeClipParams(\n choice: ReframeChoice,\n src: Dims,\n out: Dims,\n): { op: 'reframe'; params: Record<string, unknown> } {\n const shape = shapeAgainst(src, choice.format.ratio);\n const params: Record<string, unknown> = {\n width: out.width,\n height: out.height,\n fit: choice.fit === 'crop' ? 'cover' : choice.fit === 'stack' ? 'stack' : 'contain',\n };\n if (choice.fit === 'stack') {\n params.background = 'auto';\n return { op: 'reframe', params };\n }\n if (choice.fit === 'crop') {\n if (shape === 'wider') params.focus_x = choice.focus;\n if (shape === 'taller') params.focus_y = choice.focus;\n return { op: 'reframe', params };\n }\n switch (choice.bars) {\n case 'match':\n params.background = 'auto';\n break;\n case 'blur':\n params.background = 'blur';\n break;\n case 'black':\n case 'white':\n Object.assign(params, { background: 'color', color: choice.bars });\n break;\n }\n return { op: 'reframe', params };\n}\n\nexport function focusName(shape: 'wider' | 'taller' | 'same', focus: number): string {\n const end = focus <= 0.25 ? 0 : focus >= 0.75 ? 2 : 1;\n if (shape === 'taller') return ['top', 'centre', 'bottom'][end]!;\n return ['left', 'centre', 'right'][end]!;\n}\n\nconst BARS_WORD: Record<Exclude<ReframeBars, 'match'>, string> = { blur: 'blurred', black: 'black', white: 'white' };\n\nexport function describeReframe(choice: ReframeChoice, src: Dims): string {\n const shape = shapeAgainst(src, choice.format.ratio);\n if (shape === 'same') return 'resized, nothing cut';\n if (choice.fit === 'crop') return `cropped from the ${focusName(shape, choice.focus)}`;\n if (choice.fit === 'stack') return 'rearranged for vertical';\n const where = shape === 'wider' ? 'above and below' : 'at the sides';\n if (choice.bars === 'match') return `fitted, its backdrop spread ${where}`;\n return `fitted with ${BARS_WORD[choice.bars]} bars ${where}`;\n}\n\nexport function formatName(format: ReframeFormat): string {\n return format.size ? format.label : format.ratio;\n}\n\n/** Bars a still can honour on the image connector (no browser canvas in RN). */\nexport function stillBars(choice: Pick<ReframeChoice, 'fit' | 'bars'>): 'black' | 'white' {\n return choice.fit !== 'stack' && choice.bars === 'white' ? 'white' : 'black';\n}\n\n/** Why a still's reframe will not look like the pick, or null when it will. */\nexport function stillReframeNote(choice: Pick<ReframeChoice, 'fit' | 'bars'>): string | null {\n if (choice.fit === 'crop') return null;\n if (choice.fit === 'stack') return 'Stack is for clips; this still is fitted with black bars instead.';\n if (choice.bars === 'match' || choice.bars === 'blur') {\n return `${choice.bars === 'match' ? 'Match' : 'Blur'} bars need a clip on the phone; this still gets black bars.`;\n }\n return null;\n}\n\n/**\n * The image-connector call for a still: CROP for a crop, PAD (with a bar\n * colour) for a fit. Output at the platform size is left to the connector's\n * own scale; a plain ratio keeps the source's pixels.\n */\nexport function reframeStillCall(\n choice: ReframeChoice,\n src: Dims,\n): { action: 'YANTRA_IMAGE_EDIT_CROP' | 'YANTRA_IMAGE_EDIT_PAD'; params: Record<string, unknown> } | null {\n const fit = choice.fit === 'crop' ? 'crop' : 'fit';\n const plan = reframePlan(src, choice.format.ratio, fit, choice.focus);\n if (!plan) return null;\n if (plan.fit === 'crop') {\n return {\n action: 'YANTRA_IMAGE_EDIT_CROP',\n params: { x: plan.x, y: plan.y, width: plan.width, height: plan.height },\n };\n }\n const bars = stillBars(choice);\n return {\n action: 'YANTRA_IMAGE_EDIT_PAD',\n params: { width: plan.width, height: plan.height, color: bars === 'white' ? '#ffffff' : '#000000' },\n };\n}\n"],"names":["width","height"],"mappings":"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"}
|