mirror of
https://seed.radicle.dev/rad:z4D5UCArafTzTQpDZNQRuqswh3ury.git
synced 2026-11-12 14:50:37 +08:00
48 lines
900 B
Svelte
48 lines
900 B
Svelte
<script lang="ts">
|
|
import type { ComponentProps } from "svelte";
|
|
|
|
import debounce from "lodash/debounce";
|
|
import { writeText } from "@tauri-apps/plugin-clipboard-manager";
|
|
|
|
import Icon from "./Icon.svelte";
|
|
|
|
const {
|
|
id,
|
|
}: {
|
|
id: string;
|
|
} = $props();
|
|
|
|
let icon: ComponentProps<typeof Icon>["name"] = $state("copy");
|
|
|
|
const restoreIcon = debounce(() => {
|
|
icon = "copy";
|
|
}, 1000);
|
|
|
|
async function copy() {
|
|
await writeText(id);
|
|
icon = "checkmark";
|
|
restoreIcon();
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.copyable-id {
|
|
cursor: pointer;
|
|
color: var(--color-foreground-dim);
|
|
}
|
|
|
|
.copyable-id:hover {
|
|
color: var(--color-foreground-contrast);
|
|
}
|
|
</style>
|
|
|
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
<div
|
|
role="button"
|
|
tabindex="0"
|
|
onclick={copy}
|
|
class="copyable-id global-flex txt-small txt-monospace">
|
|
{id}
|
|
<Icon name={icon} />
|
|
</div>
|