1
0
Fork 0
mirror of synced 2024-09-28 15:21:28 +12:00
budibase/packages/client/src/components/app/SpectrumCard.svelte

139 lines
3.2 KiB
Svelte
Raw Normal View History

2021-07-01 03:33:19 +12:00
<script>
import "@spectrum-css/card/dist/index-vars.css"
import { getContext } from "svelte"
import { Button } from "@budibase/bbui"
2021-07-01 03:33:19 +12:00
export let title
export let subtitle
2021-07-01 03:33:35 +12:00
export let description
2021-07-01 03:33:19 +12:00
export let imageURL
2021-07-01 03:33:35 +12:00
export let linkURL
export let linkPeek
2021-07-01 03:33:35 +12:00
export let horizontal
export let showButton
export let buttonText
export let buttonOnClick
2021-07-01 03:33:19 +12:00
const { styleable, routeStore } = getContext("sdk")
2021-07-01 03:33:19 +12:00
const component = getContext("component")
2021-07-01 03:33:35 +12:00
const handleLink = e => {
if (!linkURL) {
return
}
e.preventDefault()
routeStore.actions.navigate(linkURL, linkPeek)
}
2021-07-01 03:33:19 +12:00
</script>
<div
use:styleable={$component.styles}
class="spectrum-Card"
tabindex="0"
role="figure"
2021-07-01 03:33:35 +12:00
class:horizontal
2021-07-01 03:33:19 +12:00
>
{#if imageURL}
<div
class="spectrum-Card-coverPhoto"
style="background-image: url({imageURL})"
/>
{/if}
2021-07-01 03:33:35 +12:00
<div class="spectrum-Card-container">
<div class="spectrum-Card-body">
<div class="spectrum-Card-header">
2021-07-01 03:33:19 +12:00
<div
2021-07-01 03:33:35 +12:00
class="spectrum-Card-title spectrum-Heading spectrum-Heading--sizeXS"
on:click={handleLink}
class:link={linkURL}
2021-07-01 03:33:19 +12:00
>
{title || "Card Title"}
2021-07-01 03:33:19 +12:00
</div>
</div>
2021-07-01 03:33:35 +12:00
{#if subtitle}
<div class="spectrum-Card-content">
<div
class="spectrum-Card-subtitle spectrum-Detail spectrum-Detail--sizeS"
>
{subtitle}
</div>
</div>
{/if}
</div>
{#if description}
<div class="spectrum-Card-footer">
{description}
</div>
2021-07-01 03:33:19 +12:00
{/if}
{#if showButton}
<div class="spectrum-Card-footer button-container">
<Button on:click={buttonOnClick} secondary>{buttonText || ""}</Button>
</div>
{/if}
2021-07-01 03:33:19 +12:00
</div>
</div>
<style>
.spectrum-Card {
width: 300px;
2021-07-01 03:33:35 +12:00
border-color: var(--spectrum-global-color-gray-300) !important;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
}
.spectrum-Card.horizontal {
flex-direction: row;
width: 420px;
}
.spectrum-Card-container {
padding: var(--spectrum-global-dimension-size-50) 0;
}
.spectrum-Card-title.link {
transition: color 130ms ease-in-out;
}
.spectrum-Card-title.link:hover {
cursor: pointer;
color: var(--spectrum-link-primary-m-text-color-hover);
2021-07-01 03:33:35 +12:00
}
.spectrum-Card-subtitle {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.spectrum-Card-footer {
word-wrap: anywhere;
white-space: pre-wrap;
2021-07-01 03:33:35 +12:00
}
.horizontal .spectrum-Card-coverPhoto {
flex: 0 0 160px;
height: auto;
border-bottom-left-radius: calc(
var(--spectrum-alias-border-radius-regular) - 1px
);
border-top-right-radius: 0;
}
.horizontal .spectrum-Card-container {
width: 0;
flex: 1 1 auto;
}
.spectrum-Card-footer {
border-top: none;
padding-top: 0;
padding-bottom: 0;
2021-07-01 03:33:35 +12:00
margin-top: -8px;
margin-bottom: var(
--spectrum-card-body-padding-bottom,
var(--spectrum-global-dimension-size-300)
);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
2021-07-01 03:33:19 +12:00
}
.button-container {
margin-bottom: var(--spectrum-global-dimension-size-300);
}
2021-07-01 03:33:19 +12:00
</style>