Files
hao-ai-lab-FastVideo/apps/fastvideo_studio/src/lib/components/CreateJobButton.svelte
T

127 lines
2.6 KiB
Svelte

<script lang="ts">
import type { JobType } from "$lib/types";
import { WORKLOAD_OPTIONS } from "$lib/jobConfig";
import { triggerRefresh } from "$lib/stores/jobsRefresh";
import CreateJobModal from "./CreateJobModal.svelte";
let { jobType }: { jobType: JobType } = $props();
let modalOpen = $state(false);
const options = $derived(WORKLOAD_OPTIONS[jobType] ?? []);
let workloadType = $state(options[0]?.type ?? "t2v");
function openModal(type: string) {
workloadType = type;
modalOpen = true;
}
function handleSuccess() {
triggerRefresh();
modalOpen = false;
}
</script>
<div class="wrapper">
<button type="button" class="btn btnPrimary trigger">Create Job</button>
<div class="menu" role="menu">
{#each options as opt}
<button
type="button"
class="menuItem"
role="menuitem"
onclick={() => openModal(opt.type)}
>
{opt.label}
<div class="menuItemDesc">{opt.desc}</div>
</button>
{/each}
</div>
</div>
<CreateJobModal
isOpen={modalOpen}
onClose={() => (modalOpen = false)}
onSuccess={handleSuccess}
{jobType}
{workloadType}
/>
<style>
.wrapper {
position: relative;
display: inline-block;
}
.trigger {
display: flex;
align-items: center;
gap: 0.35rem;
}
.trigger::after {
content: "";
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 5px solid currentColor;
opacity: 0.85;
}
.menu {
position: absolute;
top: 100%;
right: 0;
margin-top: 0.25rem;
min-width: 100%;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
padding: 0.25rem 0;
opacity: 0;
visibility: hidden;
transform: translateY(-4px);
transition: opacity 0.15s, visibility 0.15s, transform 0.15s;
z-index: 200;
}
.wrapper:hover .menu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.menuItem {
display: block;
width: 100%;
padding: 0.5rem 1rem;
border: none;
background: transparent;
color: var(--text);
font-family: inherit;
font-size: 0.9rem;
font-weight: 500;
text-align: left;
cursor: pointer;
transition: background 0.1s;
white-space: nowrap;
}
.menuItem:hover {
background: var(--border);
}
.menuItemDesc {
font-size: 0.75rem;
color: var(--text-dim);
font-weight: 400;
margin-top: 0.1rem;
}
.btn {
cursor: pointer;
border: none;
border-radius: var(--radius);
font-family: inherit;
font-weight: 600;
font-size: 0.85rem;
padding: 0.55rem 1.2rem;
}
.btnPrimary {
background: var(--accent);
color: #fff;
}
</style>