Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
<svelte:head> | |
<title>Generate your Image</title> | |
<meta name="description" content="Svelte demo app" /> | |
</svelte:head> | |
<script lang="ts"> | |
import { get } from "svelte/store"; | |
import Button from "$lib/components/Button.svelte"; | |
import Textarea from "$lib/components/fields/Textarea.svelte"; | |
import Banner from "$lib/components/generate/Banner.svelte"; | |
import Response from "$lib/components/generate/Response.svelte"; | |
import Autocomplete from "$lib/components/models/autocomplete/Autocomplete.svelte"; | |
import { generationStore } from "$lib/stores/use-generation"; | |
import { error } from "$lib/utils/toaster.js"; | |
export let data | |
let generation = get(generationStore); | |
let loading: boolean = false; | |
let form = ((data?.model?.id && generation?.form?.model?.id && data?.model?.id !== generation?.form?.model?.id) || !generation?.form) ? { | |
model: data?.model ?? null, | |
inputs: `${data?.model?.instance_prompt ?? ""}`, | |
parameters: { | |
negative_prompt: "" | |
} | |
} : generation?.form | |
const handleSubmit = async () => { | |
if (loading) return | |
loading = true | |
const request = await fetch(`/api/generate`, { | |
method: "POST", | |
headers: { | |
"Content-Type": "application/json" | |
}, | |
body: JSON.stringify(form) | |
}); | |
const response = await request.json(); | |
if (response?.error) { | |
error(response?.error) | |
} else { | |
generationStore.set({ | |
image: response?.image, | |
gallery: response?.gallery, | |
form: form | |
}) | |
} | |
loading = false | |
} | |
</script> | |
<main class="grid grid-cols-5 w-full h-full gap-5 xl:gap-10"> | |
<div class="w-full px-6 py-10 lg:px-10 lg:py-12 col-span-5 xl:col-span-3"> | |
<div class="w-full flex gap-8 flex-col-reverse xl:flex-col"> | |
<Banner /> | |
<h1 class="text-white font-semibold text-2xl"> | |
Start generating | |
</h1> | |
</div> | |
<div class="mt-5 grid grid-cols-1 gap-6"> | |
<div> | |
<p class="text-neutral-300 mb-2.5 text-base">Models</p> | |
<Autocomplete | |
value={form?.model} | |
defaultModels={data?.models?.cards} | |
onChange={(model) => { | |
form.model = model | |
}} | |
/> | |
</div> | |
<div> | |
<p class="text-neutral-300 mb-2.5 text-base">Prompt</p> | |
<Textarea | |
value={form?.inputs} | |
placeholder="Aerial photography of a desert through autumn forests, with vibrant red and orange foliage" | |
onChange={(inputs) => form.inputs = inputs} | |
/> | |
</div> | |
<div> | |
<p class="text-neutral-300 mb-2.5 text-base">Negative Prompt</p> | |
<Textarea | |
value={form?.parameters?.negative_prompt} | |
placeholder="Write your negative prompt here" | |
onChange={(negative_prompt) => form.parameters.negative_prompt = negative_prompt} | |
/> | |
</div> | |
<div class="flex justify-end"> | |
<Button | |
icon="fluent:glance-horizontal-sparkles-16-filled" | |
theme="pink" | |
size="lg" | |
{loading} | |
onClick={handleSubmit} | |
> | |
Generate | |
</Button> | |
</div> | |
</div> | |
</div> | |
<Response loading_generation={loading} /> | |
</main> |