budibase/packages/builder/src/components/start/TemplateList.svelte

76 lines
1.8 KiB
Svelte
Raw Normal View History

2020-09-25 15:47:42 +02:00
<script>
import { Button, Heading, Body } from "@budibase/bbui"
2020-09-25 15:47:42 +02:00
import AppCard from "./AppCard.svelte"
import Spinner from "components/common/Spinner.svelte"
2020-09-28 18:04:08 +02:00
import api from "builderStore/api"
2020-09-25 15:47:42 +02:00
export let onSelect
2020-09-28 18:04:08 +02:00
async function fetchTemplates() {
const response = await api.get("/api/templates?type=app")
return await response.json()
2020-09-25 15:47:42 +02:00
}
let templatesPromise = fetchTemplates()
</script>
<div class="root">
<Heading medium black>Start With a Template</Heading>
{#await templatesPromise}
<div class="spinner-container">
<Spinner size="30" />
</div>
{:then templates}
2020-09-25 15:47:42 +02:00
<div class="templates">
{#each templates as template}
<div class="templates-card">
<Heading black medium>{template.name}</Heading>
<Body medium grey>{template.category}</Body>
<Body small black>{template.description}</Body>
<div>
<img src={template.image} width="300" />
</div>
2020-09-25 15:47:42 +02:00
<div class="card-footer">
<Button secondary on:click={() => onSelect(template)}>
Create {template.name}
</Button>
</div>
</div>
{/each}
</div>
{:catch err}
<h1 style="color:red">{err}</h1>
{/await}
</div>
2020-09-25 15:47:42 +02:00
<style>
.templates {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
grid-gap: var(--layout-m);
justify-content: start;
}
.templates-card {
background-color: var(--white);
padding: var(--spacing-xl);
border-radius: var(--border-radius-m);
border: var(--border-dark);
}
.card-footer {
margin-top: var(--spacing-m);
}
2020-09-25 15:47:42 +02:00
h3 {
font-size: var(--font-size-l);
font-weight: 600;
color: var(--ink);
text-transform: capitalize;
}
.root {
margin: 20px 80px;
}
</style>