radames's picture
fix copy
f3dda63 unverified
raw
history blame contribute delete
No virus
1.49 kB
<script lang="ts">
import type { Color } from 'd3-color';
import * as d3 from 'd3-color';
export let colors: Color[];
const n = colors.length;
function getLabelColor(c: Color): string {
const color = d3.hcl(c);
if (color.l > 50) {
return d3.hcl(color.h, color.c, 0).formatHex();
}
return d3.hcl(color.h, color.c, 100).formatHex();
}
let isCopying = -1;
async function copyStringToClipboard(text: string, n: number) {
// usingo Clipboard API
if (isCopying > -1) return;
isCopying = n;
// await navigator.permissions.query({ name: 'clipboard-write' });
await navigator.clipboard.write([
new ClipboardItem({ 'text/plain': new Blob([text], { type: 'text/plain' }) })
]);
setTimeout(() => {
isCopying = -1;
}, 800);
}
</script>
<div class="flex flex-col items-center">
<div class="flex">
{#each colors as color, i}
<div
class="{isCopying === i ? '' : 'cursor-pointer'} aspect-square relative"
style="background-color: {color.formatHex()}"
on:click={() => copyStringToClipboard(color.formatHex(), i)}
>
<svg class="block max-w-full aspect-square" width="100" viewBox="0 0 50 50">
<rect x="0" y="0" width="50" height="50" fill={color.formatHex()} />
</svg>
<span
title="Copy single color"
class="absolute bottom-0 text-center text-xs pl-1 font-bold uppercase"
style="color:{getLabelColor(color)}"
>{isCopying === i ? 'copied' : color.formatHex()}</span
>
</div>
{/each}
</div>
</div>