wordalle / frontend /src /lib /Result.svelte
radames's picture
first
47cfe3f
raw
history blame
2.83 kB
<script lang="ts">
import { colors } from '$lib/utils';
import type { Board } from '../types';
import { fade } from 'svelte/transition';
export let message: string | null = null;
export let board: Board;
export let currentRowIndex: number;
export let imagePaths: string[];
import domtoimage from 'dom-to-image';
let elToShare: HTMLDivElement;
// let domToImage: DomToImage;
let copyState = false;
// onMount(async () => {
// domToImage = (await import('dom-to-image')) as unknown as DomToImage;
// });
async function writeClipDOM(node: HTMLDivElement) {
try {
await navigator.clipboard.write([
new ClipboardItem({
'image/png': domtoimage.toBlob(node)
})
]);
copyState = true;
setTimeout(() => (copyState = false), 1000);
console.log('Fetched image copied.');
} catch (err) {
console.log(err.name, err.message);
}
}
const s = 10;
const p = 1;
const rx = s / 10;
</script>
<!-- Modal made with tailwind -->
<div class="modal relative z-2" transition:fade>
<div class="message">
{message}
<div class="max-w-xs border-0 p-3 mx-auto">
<div bind:this={elToShare}>
<div class="grid grid-cols-3 gap-2 max-w-md mx-auto p-3">
{#each imagePaths as image}
<div>
<img src={image} alt="" class="w-full h-full" />
</div>
{/each}
</div>
<pre class="text-[0.5rem]" />
<svg
class="w-full"
viewBox="0 0 {board[0].length * (p + s)} {board.length * (p + s)}"
xmlns="http://www.w3.org/2000/svg"
>
{#each board as row, y}
{#each row as tile, x}
<rect
fill={colors[tile.state]}
x={x * (s + p)}
y={y * (s + p)}
width={s}
height={s}
{rx}
/>
{/each}
{/each}
</svg>
</div>
</div>
<p>
Copy the result to clipboard
<button class="min-w-[6ch]" on:click={() => writeClipDOM(elToShare)}>
{!copyState ? 'Copy' : 'Copied'}
</button>. Then go to Twitter and Share
<a
class="go-tweet"
target="_blank"
rel="noopener noreferrer"
href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fhuggingface.co%2Fspaces%2Fosanseviero%2Fwordalle&via=huggingface&hashtags=dallemini"
>
Share on Twitter
</a>
or <button class="min-w-[6ch]" on:click={() => window.location.reload()}> Try again </button>
</p>
</div>
</div>
<style lang="postcss" scoped>
.message {
@apply absolute left-1/2 top-16 text-white bg-black bg-opacity-80 font-semibold
p-10 z-20 rounded-md -translate-x-1/2 transition-opacity duration-300 ease-in-out;
}
.modal {
@apply fixed top-0 left-0 w-screen min-h-screen z-10 bg-black bg-opacity-80 backdrop-blur-sm;
}
.go-tweet,
button {
@apply bg-gray-700 hover:bg-gray-900 text-white font-bold p-1 my-1 text-sm rounded transition-opacity duration-500 ease-in-out;
}
</style>