feat(gtm): add aspect ratio & corporate design; fix(market): harden backend logging & json parsing

This commit is contained in:
2026-01-05 11:42:15 +00:00
parent 7be63b6d14
commit a5f43fb977
10 changed files with 241 additions and 169 deletions

View File

@@ -227,9 +227,8 @@ const App: React.FC = () => {
// Phase 6 Image Generation State
const [generatingImages, setGeneratingImages] = useState<Record<number, boolean>>({});
const [generatedImages, setGeneratedImages] = useState<Record<number, string>>({});
// Phase 6 Editing State
const [editingIndex, setEditingIndex] = useState<number | null>(null);
const [aspectRatio, setAspectRatio] = useState('16:9');
const [editingIndex, setEditingIndex] = useState<number | null>(null);
const canvasRef = useRef<HTMLCanvasElement>(null);
const [isDrawing, setIsDrawing] = useState(false);
const [brushColor, setBrushColor] = useState('#ef4444'); // Red for annotations
@@ -487,7 +486,7 @@ const App: React.FC = () => {
// If not sketching, use the array of uploaded product images
const refImages = overrideReference ? [overrideReference] : state.productImages;
const imageUrl = await Gemini.generateConceptImage(prompt, refImages);
const imageUrl = await Gemini.generateConceptImage(prompt, refImages, aspectRatio);
setGeneratedImages(prev => ({ ...prev, [index]: imageUrl }));
// If we were editing, close edit mode
@@ -1699,7 +1698,18 @@ const App: React.FC = () => {
<h4 className="font-bold text-slate-800 dark:text-white">{prompt.title}</h4>
<p className="text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wide mt-1">{prompt.context}</p>
</div>
<div className="flex gap-2">
<div className="flex items-center gap-2">
<select
value={aspectRatio}
onChange={e => setAspectRatio(e.target.value)}
className="text-xs font-bold rounded bg-white dark:bg-robo-800 border border-slate-200 dark:border-robo-600 hover:border-blue-400 dark:hover:border-robo-500 transition-colors text-slate-600 dark:text-slate-300 focus:ring-2 focus:ring-purple-500 outline-none"
>
<option value="16:9">16:9 (Landscape)</option>
<option value="9:16">9:16 (Portrait)</option>
<option value="1:1">1:1 (Square)</option>
<option value="4:3">4:3 (Classic)</option>
</select>
<button
onClick={() => handleGenerateImage(prompt.prompt, i)}
disabled={generatingImages[i]}

View File

@@ -102,8 +102,8 @@ export const translateReportToEnglish = async (reportMarkdown: string): Promise<
return callApi<{ report: string }>('run', 'translate', { reportMarkdown });
};
export const generateConceptImage = async (prompt: string, referenceImagesBase64?: string[]): Promise<string> => {
const result = await callApi<{ imageBase64: string }>('run', 'image', { prompt, referenceImagesBase64 });
export const generateConceptImage = async (prompt: string, referenceImagesBase64?: string[], aspectRatio?: string): Promise<string> => {
const result = await callApi<{ imageBase64: string }>('run', 'image', { prompt, referenceImagesBase64, aspectRatio });
return result.imageBase64;
};