inference-playground / src /lib /components /InferencePlayground /InferencePlaygroundHFTokenModal.svelte
mishig's picture
mishig HF staff
format
eeca96c
raw
history blame
4.57 kB
<script lang="ts">
import { browser } from "$app/environment";
import { createEventDispatcher, onDestroy, onMount } from "svelte";
import IconCross from "../Icons/IconCross.svelte";
export let storeLocallyHfToken = false;
let backdropEl: HTMLDivElement;
let modalEl: HTMLDivElement;
const dispatch = createEventDispatcher<{ close: void }>();
function handleKeydown(event: KeyboardEvent) {
const { key } = event;
if (key === "Escape") {
event.preventDefault();
dispatch("close");
}
}
function handleBackdropClick(event: MouseEvent) {
if (window?.getSelection()?.toString()) {
return;
}
if (event.target === backdropEl) {
dispatch("close");
}
}
onMount(() => {
document.getElementById("app")?.setAttribute("inert", "true");
modalEl.focus();
});
onDestroy(() => {
if (!browser) return;
// remove inert attribute if this is the last modal
if (document.querySelectorAll('[role="dialog"]:not(#app *)').length === 1) {
document.getElementById("app")?.removeAttribute("inert");
}
});
</script>
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
<div
id="default-modal"
aria-hidden="true"
class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/85"
bind:this={backdropEl}
on:click|stopPropagation={handleBackdropClick}
>
<div
role="dialog"
tabindex="-1"
class="relative max-h-full w-full max-w-xl p-4 outline-none"
bind:this={modalEl}
on:keydown={handleKeydown}
>
<form on:submit|preventDefault class="relative rounded-lg bg-white shadow dark:bg-gray-900">
<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
<img
alt="Hugging Face's logo"
class="w-7"
src="https://huggingface.co/front/assets/huggingface_logo-noborder.svg"
/> Add a Hugging Face Token
</h3>
<button
type="button"
on:click={() => dispatch("close")}
class="ms-auto inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
>
<IconCross classNames="text-xl" />
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-4 md:p-5">
<p class="mb-5 text-base leading-relaxed text-gray-800 2xl:text-balance dark:text-gray-300">
You need a free Hugging Face token to use this application. <strong class="font-semibold"
>Make sure you create a token with Inference API permission.</strong
><br /> Your token is kept safe by only being used from your browser.
</p>
<div>
<label for="hf-token" class="text-smd mb-3 block font-medium text-gray-900 dark:text-white"
>Hugging Face Token</label
>
<input
required
placeholder="Enter HF Token"
type="text"
id="hf-token"
name="hf-token"
class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
/>
</div>
<label class="mt-4 flex items-center gap-x-1.5 text-gray-900 dark:text-gray-200">
<input type="checkbox" bind:checked={storeLocallyHfToken} />
<p class="text-sm leading-none">Save to local storage for future use</p></label
>
</div>
<!-- Modal footer -->
<div class="flex items-center justify-between rounded-b border-t border-gray-200 p-4 md:p-5 dark:border-gray-800">
<a
href="https://huggingface.co/settings/tokens/new?globalPermissions=inference.serverless.write&tokenType=fineGrained"
tabindex="-1"
target="_blank"
class="rounded-lg border border-gray-200 bg-white px-5 py-2.5 text-sm font-medium text-gray-900 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:outline-none focus:ring-4 focus:ring-gray-100 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
>Create new token</a
>
<button
type="submit"
class="rounded-lg bg-black px-5 py-2.5 text-sm font-medium text-white hover:bg-gray-900 focus:outline-none focus:ring-4 focus:ring-gray-300 dark:border-gray-700 dark:bg-gray-800 dark:hover:bg-gray-700 dark:focus:ring-gray-700"
>Submit</button
>
</div>
</form>
</div>
</div>