|
|
import os |
|
|
import google.generativeai as genai |
|
|
import gradio as gr |
|
|
import asyncio |
|
|
from pyppeteer import launch |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
genai.configure(api_key=os.environ["GENAI_API_KEY"]) |
|
|
model = genai.GenerativeModel("gemini-2.0-flash") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_mockup_html(user_prompt): |
|
|
system_prompt = ( |
|
|
"You are a Power Apps mockup generator. " |
|
|
"Convert user descriptions into complete HTML + CSS code that looks like a Power Apps mobile screen. " |
|
|
"Do NOT include JSON or explanations. Only return valid HTML + CSS." |
|
|
) |
|
|
response = model.generate_content(system_prompt + "\n" + user_prompt) |
|
|
return response.text |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def render_html_to_png(html_code, output_file="mockup.png"): |
|
|
browser = await launch(args=["--no-sandbox"]) |
|
|
page = await browser.newPage() |
|
|
await page.setContent(html_code) |
|
|
await page.screenshot({"path": output_file, "fullPage": True}) |
|
|
await browser.close() |
|
|
return output_file |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gradio_mockup(user_prompt): |
|
|
html_code = generate_mockup_html(user_prompt) |
|
|
asyncio.get_event_loop().run_until_complete(render_html_to_png(html_code)) |
|
|
return "mockup.png" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
demo = gr.Interface( |
|
|
fn=gradio_mockup, |
|
|
inputs=gr.Textbox(label="Describe your PowerApps mockup screen", lines=3), |
|
|
outputs=gr.Image(type="filepath", label="Generated Mockup"), |
|
|
title="PowerApps Mockup Generator", |
|
|
description="Enter your screen description and get a PowerApps-style mockup as an image." |
|
|
) |
|
|
|
|
|
demo.launch() |