|
<script lang="ts">
|
|
import type { ComponentData } from "./utils";
|
|
import CopyButton from "$lib/icons/CopyButton.svelte";
|
|
import { BaseCode } from "@gradio/code";
|
|
import { onMount } from "svelte";
|
|
|
|
export let data: ComponentData;
|
|
|
|
let source_code_link = `https://huggingface.co/spaces/${data.id}`;
|
|
let author_link = `https://huggingface.co/${data.author}`;
|
|
let discussion_link = `https://huggingface.co/spaces/${data.id}/discussions/new`;
|
|
let code_url = `https://huggingface.co/spaces/${data.id}/raw/main/app.py`;
|
|
const tabs = ["Demo", "Code"];
|
|
let active_tab = 0;
|
|
let code: string;
|
|
|
|
onMount(async () => {
|
|
code = await fetch(code_url).then((res) => res.text());
|
|
});
|
|
</script>
|
|
|
|
<div class="card space-y-2 bg-gradient-to-tr {data.background_color} shadow-xl">
|
|
<h1 class="text-xl font-black">{data.description}</h1>
|
|
<div class="flex flex-row">
|
|
<div class="ml-2">
|
|
<code class="code text-md">
|
|
pip install {data.name.replace("_", "-")}
|
|
<CopyButton content={`pip install ${data.name.replace("_", "-")}`} />
|
|
</code>
|
|
</div>
|
|
<div class="ml-2">
|
|
<strong>ποΈ Author</strong>
|
|
<a
|
|
href={author_link}
|
|
target="_blank"
|
|
class="link text-orange-400 font-bold">{data.author}</a
|
|
>
|
|
</div>
|
|
<div class="ml-2">
|
|
<strong>π Template</strong>
|
|
{data.template}
|
|
</div>
|
|
<div class="ml-2">
|
|
<strong>π’ Version:</strong>
|
|
{data.version}
|
|
</div>
|
|
<div class="ml-2">
|
|
<strong>π§¬</strong>
|
|
<a
|
|
href={source_code_link}
|
|
target="_blank"
|
|
class="link text-orange-400 font-bold">code</a
|
|
>
|
|
</div>
|
|
</div>
|
|
<div class="flex flex-row">
|
|
<div class="ml-2">
|
|
<strong>π Tags:</strong>
|
|
{data.tags.split(",").join(", ")}
|
|
</div>
|
|
</div>
|
|
<div class="flex flex-row">
|
|
<div class="ml-2">
|
|
<strong>π€ Feedback? Stuck?</strong>
|
|
<a
|
|
href={discussion_link}
|
|
target="_blank"
|
|
class="link text-orange-400 font-bold"
|
|
>
|
|
Ask for help</a
|
|
>
|
|
</div>
|
|
</div>
|
|
<div class="flex flex-col relative h-full">
|
|
<div class="tabs flex flex-row relative">
|
|
{#each tabs as tab, index}
|
|
<div
|
|
class="tab bg-white {active_tab === index
|
|
? 'active'
|
|
: ''} {active_tab === index
|
|
? ''
|
|
: 'border-b-2'} px-8 py-1 rounded-t-md border-x-2 border-t-2 border-orange-300 content-center"
|
|
on:click={() => {
|
|
active_tab = index;
|
|
}}
|
|
>
|
|
{tab}
|
|
</div>
|
|
{/each}
|
|
</div>
|
|
{#if active_tab === 0}
|
|
<iframe
|
|
src={`https://${data.subdomain}.hf.space?__theme=light`}
|
|
height="100%"
|
|
width="100%"
|
|
></iframe>
|
|
{:else}
|
|
<div class="bg-white">
|
|
<BaseCode value={code} language="python" dark_mode={false} />
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
|
|
<style>
|
|
.card {
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
margin: 16px;
|
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow-y: auto;
|
|
height: 100%;
|
|
}
|
|
|
|
.card p {
|
|
margin: 8px 0;
|
|
color: rgb(206 100 0 / var(--tw-text-opacity));
|
|
}
|
|
|
|
.link {
|
|
text-decoration: underline;
|
|
}
|
|
.code {
|
|
font-family: monospace;
|
|
background-color: #f8f9fa;
|
|
padding: 0.2em 0.4em;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.tabs {
|
|
display: flex;
|
|
margin-bottom: -1px;
|
|
}
|
|
|
|
.tab {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.active {
|
|
font-weight: bold;
|
|
}
|
|
</style>
|
|
|