| <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> | |