feat(gtm): add aspect ratio & corporate design; fix(market): harden backend logging & json parsing
This commit is contained in:
@@ -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]}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user