187 lines
5.5 KiB
Svelte
187 lines
5.5 KiB
Svelte
<script lang="ts">
|
||
import Content from "$lib/viewport/content.svelte";
|
||
import Banner2 from "$lib/banner2.svelte";
|
||
import TableOfContents from "$lib/components/table-of-contents.svelte";
|
||
|
||
export let data;
|
||
</script>
|
||
|
||
<svelte:head>
|
||
<title>Art Feed | denizk0461</title>
|
||
</svelte:head>
|
||
|
||
{#snippet pageButtons(currentIndex: number)}
|
||
<div class="page-button-container blurred-background">
|
||
{#if currentIndex == 1}
|
||
<p class="page-button page-button-left page-button-disabled">x</p>
|
||
{:else}
|
||
<a class="page-button page-button-left page-button-clickable" href="?p={currentIndex - 1}"><</a>
|
||
{/if}
|
||
|
||
{#each { length: data.maxPages }, index}
|
||
<a class="page-index" href="?p={index + 1}">{index + 1}</a>
|
||
{/each}
|
||
|
||
{#if currentIndex == data.maxPages}
|
||
<p class="page-button page-button-right page-button-disabled">x</p>
|
||
{:else}
|
||
<a class="page-button page-button-right page-button-clickable" href="?p={currentIndex + 1}">></a>
|
||
{/if}
|
||
</div>
|
||
{/snippet}
|
||
|
||
<Content>
|
||
<Banner2
|
||
title="Creative Feed"
|
||
banner="banner.webp"
|
||
bannerAlt="Mirror picture of me, pixelated beyond recognition"
|
||
subtitle="minor things I have worked on"
|
||
/>
|
||
|
||
<p>Welcome to my creative feed! It is heavily inspired by <a href="https://deathsurplus.com/">DeathSurplus' art blog</a> – definitely go check out his website!</p>
|
||
|
||
<p>This page is intended to be a contrasting companion to the <a href="/projects"><code>projects</code> page</a>; I'll use this page for smaller things that don't fit the dedicated-page-format.</p>
|
||
|
||
<!-- <TableOfContents /> -->
|
||
|
||
{@render pageButtons(data.currentPage)}
|
||
|
||
{#each data.feedEntries as entry}
|
||
<h2>{entry.title}</h2>
|
||
<p class="subtitle">{entry.subtitle}</p>
|
||
<p class="subtitle">{entry.date}</p>
|
||
<svelte:component this={entry.content} />
|
||
{#if entry.images && entry.images.length > 0}
|
||
<div class="image-gallery">
|
||
{#each entry.images as i, index}
|
||
<a class="image-gallery-link" href="{entry.path}/{i}.webp">
|
||
<img class="image-gallery-img" loading="lazy" src="{entry.path}/{i}.webp" alt={entry.imageAlts[index]}>
|
||
</a>
|
||
{/each}
|
||
</div>
|
||
{/if}
|
||
{/each}
|
||
|
||
{@render pageButtons(data.currentPage)}
|
||
|
||
</Content>
|
||
|
||
<style>
|
||
.page-button-container {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: stretch;
|
||
justify-content: center;
|
||
border-radius: var(--border-radius);
|
||
overflow: hidden;
|
||
width: fit-content;
|
||
margin: 12px auto;
|
||
border-top: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||
border-bottom: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||
}
|
||
|
||
.page-button, .page-index {
|
||
font-family: var(--font-mono);
|
||
padding: 8px 18px;
|
||
font-weight: 600;
|
||
margin: 0;
|
||
transition: background-color var(--duration-animation) var(--anim-curve);
|
||
}
|
||
|
||
.page-button {
|
||
color: var(--color-text);
|
||
}
|
||
.page-button-left {
|
||
border-right: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||
}
|
||
.page-button-right {
|
||
border-left: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
|
||
}
|
||
.page-button-clickable:hover {
|
||
cursor: pointer;
|
||
}
|
||
|
||
.page-button-disabled {
|
||
color: var(--color-text-tertiary);
|
||
cursor: not-allowed;
|
||
}
|
||
|
||
.page-index:link, .page-index:visited {
|
||
color: var(--color-text)
|
||
}
|
||
|
||
.page-index:hover, .page-button-clickable:hover {
|
||
text-decoration: none;
|
||
background-color: var(--color-background-highlight-alt);
|
||
}
|
||
|
||
.image-gallery {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||
gap: 4px;
|
||
}
|
||
|
||
.image-gallery-img {
|
||
width: 100%;
|
||
height: 100%;
|
||
display: block;
|
||
object-fit: cover;
|
||
filter: brightness(60%) saturate(80%);
|
||
max-height: 320px;
|
||
transition: filter var(--duration-animation) var(--anim-curve),
|
||
scale var(--duration-animation) var(--anim-curve);
|
||
scale: 1.04;
|
||
}
|
||
|
||
.image-gallery-link {
|
||
outline: var(--border-style) var(--border-dash-size) transparent;
|
||
border-radius: var(--border-radius);
|
||
z-index: 10;
|
||
transition: outline-color var(--duration-animation) var(--anim-curve);
|
||
overflow: hidden;
|
||
margin: 0;
|
||
}
|
||
|
||
.image-gallery-link:hover .image-gallery-img {
|
||
filter: brightness(100%) saturate(100%);
|
||
scale: 1.0;
|
||
}
|
||
|
||
.image-gallery-link:hover {
|
||
outline-color: var(--color-highlight);
|
||
}
|
||
|
||
.subtitle {
|
||
font-family: var(--font-mono);
|
||
margin: 0;
|
||
font-size: 1rem;
|
||
line-height: 1.4rem;
|
||
font-style: italic;
|
||
font-weight: 700;
|
||
color: var(--color-highlight-alt);
|
||
}
|
||
|
||
.subtitle::before {
|
||
content: "<!-- ";
|
||
}
|
||
|
||
.subtitle::after {
|
||
content: " -->";
|
||
}
|
||
|
||
@media screen and (max-width: 800px) {
|
||
/* .image-gallery-link, .image-gallery-link:hover .image-gallery-img {
|
||
border-radius: 0;
|
||
} */
|
||
|
||
.image-gallery-link:hover {
|
||
outline-color: transparent;
|
||
}
|
||
|
||
.image-gallery-img {
|
||
border-radius: 0;
|
||
scale: 1.0;
|
||
filter: brightness(100%) saturate(100%);
|
||
}
|
||
}
|
||
</style> |