diff --git a/frontend/js/i18n/en.js b/frontend/js/i18n/en.js index 8e39130..065f07c 100644 --- a/frontend/js/i18n/en.js +++ b/frontend/js/i18n/en.js @@ -605,8 +605,16 @@ export default { 'designer.ai.placeholder': "Describe your sign — e.g. 'Summer sale, 20% off mains, bright modern'", 'designer.ai.generate': 'Generate design', 'designer.ai.generating': 'Generating…', - 'designer.ai.contacting': 'Contacting your AI endpoint… (local models can be slow)', + 'designer.ai.contacting': 'Generating… text is quick; images add ~10–30s', 'designer.ai.done': 'Generated {n} element(s) — tweak and Publish.', + 'designer.ai.done_imgwarn': 'Generated {n} element(s) — an image couldn’t be generated (text is ready). Publish.', + 'designer.ai.images_title': 'AI images (optional)', + 'designer.ai.images_desc': 'Generate a background (and a foreground graphic) from your prompt. Point at a local sd.cpp / ComfyUI server or OpenAI. Off = text + shapes only.', + 'designer.ai.image_provider': 'Image provider', + 'designer.ai.image_off': 'Off (text + shapes only)', + 'designer.ai.image_base_url': 'Image endpoint URL', + 'designer.ai.image_model': 'Image model', + 'designer.ai.image_model_ph': 'optional — e.g. dall-e-3; blank for sd.cpp / ComfyUI', 'designer.ai.failed': 'Generation failed', 'designer.ai.need_prompt': 'Enter a prompt first', 'designer.ai.settings_title': 'AI design settings', diff --git a/frontend/js/views/designer.js b/frontend/js/views/designer.js index 5d018ef..9672ebe 100644 --- a/frontend/js/views/designer.js +++ b/frontend/js/views/designer.js @@ -136,13 +136,18 @@ export function render(container) { try { const design = await api.aiGenerateDesign(prompt); elements = []; selectedIdx = -1; - if (design.background) { + if (design.backgroundImage) { + bgImageDataUrl = design.backgroundImage; // AI-generated backdrop + if (design.background) bgValue = design.background; // kept as fallback + } else if (design.background) { bgValue = design.background; bgImageDataUrl = null; const bc = document.getElementById('bgColor'); if (bc) bc.value = design.background; } (design.elements || []).forEach(el => elements.push(el)); redraw(); - status.textContent = t('designer.ai.done', { n: (design.elements || []).length }); + status.textContent = design.image_warning + ? t('designer.ai.done_imgwarn', { n: (design.elements || []).length }) + : t('designer.ai.done', { n: (design.elements || []).length }); } catch (err) { status.textContent = (err && err.message) || t('designer.ai.failed'); } finally { @@ -340,6 +345,21 @@ async function openAiSettings() {
${t('designer.ai.images_desc')}
+