Moved cards out into seperate component to enable re-usability

This commit is contained in:
Luke Else 2023-09-28 19:22:52 +01:00
parent 26357e531d
commit 8d5319ac4a
4 changed files with 99 additions and 53 deletions

65
src/Card.svelte Normal file
View File

@ -0,0 +1,65 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function onClick() {
dispatch('click');
}
</script>
<style>
.card {
display: flex;
flex-direction: column;
justify-content: space-between;
flex-wrap: wrap;
flex: 2 1 20%;
min-width: 10em;
padding: .5em 2.5em 2em 2.5em;
background: var(--bg-grad);
border-radius: .5em;
scroll-snap-align: start;
transition: all 0.2s;
}
.card:hover {
box-shadow: .5em .5em .5em var(--cyan);
}
.card .card-header :global(div) {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0em;
}
.card .card-content :global(div) {
margin: 2em 0em;
max-width: 85%;
}
.card .card-footer :global(div){
margin-bottom: 1em;
display: flex;
gap: 1.5em;
justify-content: space-between;
}
</style>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div class="card" on:click={onClick}>
<div>
<div class="card-header">
<slot name="header"></slot>
</div>
<hr />
<div class="card-content">
<slot name="content"></slot>
</div>
</div>
<div class="card-footer">
<slot name="footer"></slot>
</div>
</div>

View File

@ -37,6 +37,7 @@
hr { hr {
border: .2em solid var(--bg-grad); border: .2em solid var(--bg-grad);
border-radius: 5em; border-radius: 5em;
width: 100%;
} }
*::-webkit-scrollbar, *::-webkit-scrollbar,

View File

@ -3,6 +3,7 @@
import { Toast, ToastType } from "$lib/toast"; import { Toast, ToastType } from "$lib/toast";
import { addToast } from "$lib/store"; import { addToast } from "$lib/store";
import Card from './Card.svelte';
import Modal from './Modal.svelte'; import Modal from './Modal.svelte';
let showModal: boolean = false; let showModal: boolean = false;
@ -58,25 +59,27 @@
font-size: 2em; font-size: 2em;
} }
.card-header h2 {
font-size: 1.5em;
}
.card-header h3 { .card-header h3 {
font-size: 1.5em; font-size: 1.5em;
} }
.card-header .logo { .card-footer {
margin-bottom: 1em;
display: flex;
gap: 1.5em;
justify-content: space-between;
}
.logo {
color: var(--fg); color: var(--fg);
font-size: 3em; font-size: 3em;
} }
/* Skills Cards CSS */ /* Skills Cards CSS */
.skills-container { .skills-container {
max-width: 90%; max-width: 90%;
padding: 0em 2em; padding: 0em 2em;
margin: em auto; margin: auto;
} }
.cards { .cards {
@ -84,40 +87,11 @@
flex-wrap: wrap; flex-wrap: wrap;
flex-direction: row; flex-direction: row;
gap: 3em 3em; gap: 3em 3em;
justify-content: center;
padding: 3em 1em 2em 0em; padding: 3em 1em 2em 0em;
list-style: none; list-style: none;
transition: all 0.2s; transition: all 0.2s;
} }
.card {
display: flex;
flex-direction: column;
flex-wrap: wrap;
flex: 2 1 20%;
min-width: 10em;
padding: .5em 2.5em 2em 2.5em;
background: var(--bg-grad);
border-radius: .5em;
scroll-snap-align: start;
transition: all 0.2s;
}
.card:hover {
box-shadow: .5em .5em .5em var(--cyan);
}
.card .card-content {
margin: 2em 0em;
max-width: 85%;
}
.card-footer {
display: flex;
gap: 1.5em;
justify-content: space-between;
margin-top: auto;
}
</style> </style>
{#await getJson('/json/me.json')} {#await getJson('/json/me.json')}
@ -140,28 +114,23 @@
</div> </div>
<div class="skills-container"> <div class="skills-container">
<ul class="cards"> <div class="cards">
{#each info.skills as skill} {#each info.skills as skill}
<!-- svelte-ignore a11y-click-events-have-key-events --> <Card on:click={() => {showModal = true; activeModal = skill}}>
<!-- svelte-ignore a11y-no-noninteractive-element-interactions --> <div slot="header">
<li on:click={() => {showModal = true; activeModal = skill}} class="card">
<div>
<div class="card-header">
<h2>{skill.skill}</h2> <h2>{skill.skill}</h2>
<i class="{skill.logo} logo"></i> <i class="{skill.logo} logo"></i>
</div> </div>
<hr /> <div slot="content">
<div class="card-content">
<p class="not-required">{skill.about}</p> <p class="not-required">{skill.about}</p>
</div> </div>
</div> <div slot="footer">
<div class="card-footer">
<a href="/contact">View More</a> <a href="/contact">View More</a>
<a href="/repos">Repos</a> <a href="/repos">Repos</a>
</div> </div>
</li> </Card>
{/each} {/each}
</ul> </div>
</div> </div>
<div style="display: none;">{addToast(new Toast("Click on a skill to open a prompt", ToastType.Info, true, 4000))}</div> <div style="display: none;">{addToast(new Toast("Click on a skill to open a prompt", ToastType.Info, true, 4000))}</div>

View File

@ -1 +1,12 @@
<script lang="ts">
</script>
<h1>Contact</h1> <h1>Contact</h1>
<div class="main-card">
<form>
test
</form>
</div>