Spaces:
Runtime error
Runtime error
File size: 2,350 Bytes
a6e7e8f 4b154d2 7c37442 5636b7a 7c37442 a6e7e8f 95c652b 7d4e291 35d6c3b 7c37442 a6e7e8f 35d6c3b a6e7e8f 95c652b a6e7e8f 7d4e291 95c652b a6e7e8f 331e32b 35d6c3b a6e7e8f 331e32b a6e7e8f d11af81 5636b7a d11af81 7d4e291 5636b7a 95c652b 7d4e291 d11af81 35d6c3b 93b70aa 5636b7a 93b70aa a6e7e8f 35946a9 7d4e291 a6e7e8f 35d6c3b 5636b7a 95c652b 5636b7a 4b154d2 5636b7a a6e7e8f 5636b7a a6e7e8f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<script lang="ts">
import { createEventDispatcher, onMount } from 'svelte';
import { useMyPresence } from '$lib/liveblocks';
import { Status } from '$lib/types';
const dispatch = createEventDispatcher();
export let initPrompt = '';
let prompt: string;
let inputEl: HTMLInputElement;
let boxEl: HTMLDivElement;
const myPresence = useMyPresence();
const onKeyup = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
myPresence.update({
status: Status.ready
});
dispatch('close');
}
};
onMount(() => {
inputEl.focus();
prompt = initPrompt;
window.addEventListener('keyup', onKeyup);
window.addEventListener('pointerdown', cancelHandler, true);
return () => {
window.removeEventListener('keyup', onKeyup);
window.removeEventListener('pointerdown', cancelHandler, true);
};
});
let timer: NodeJS.Timeout;
function debouce(newPrompt: string) {
clearTimeout(timer);
timer = setTimeout(() => {
prompt = newPrompt;
myPresence.update({
currentPrompt: prompt,
status: Status.prompting
});
}, 100);
}
function onPrompt() {
if (prompt.trim() !== '') {
dispatch('paint');
dispatch('close');
}
}
function onInput(event: Event) {
const target = event.target as HTMLInputElement;
debouce(target.value);
}
function cancelHandler(event: Event) {
if (boxEl.contains(event.target as Node)) {
return;
}
myPresence.update({
status: Status.ready
});
dispatch('close');
}
</script>
<form
class="fixed w-screen top-0 left-0 bottom-0 right-0 max-h-screen z-50 flex items-center justify-center bg-black bg-opacity-80 px-3"
on:submit|preventDefault={onPrompt}
>
<div class="flex bg-white rounded-2xl px-2 w-full max-w-md" bind:this={boxEl}>
<input
value={prompt}
bind:this={inputEl}
on:click|stopPropagation
on:input={onInput}
class="input"
placeholder="Type a prompt..."
title="Input prompt to generate image and obtain palette"
type="text"
name="prompt"
/>
<button on:click|preventDefault={onPrompt} class="font-mono border-l-2 pl-2" type="submit"
>Paint</button
>
</div>
</form>
<style lang="postcss" scoped>
.input {
@apply flex-grow text-sm m-2 p-0 disabled:opacity-50 italic placeholder:text-black text-black placeholder:text-opacity-50 border-0 focus:outline-none focus:border-gray-400 focus:ring-1;
}
</style>
|