Compare commits
6 Commits
ac123ad0d7
...
9ff26d3c0b
| Author | SHA1 | Date | |
|---|---|---|---|
| 9ff26d3c0b | |||
| 1cc7323c36 | |||
| 331b8dd95b | |||
| 1348be3ee9 | |||
| d746f8ef6f | |||
| 455eb4c291 |
4
src/lib/media/a11y-img.ts
Normal file
4
src/lib/media/a11y-img.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export interface A11yImage {
|
||||||
|
src: string;
|
||||||
|
alt: string;
|
||||||
|
}
|
||||||
75
src/lib/media/image-row.svelte
Normal file
75
src/lib/media/image-row.svelte
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { type A11yImage } from "./a11y-img";
|
||||||
|
|
||||||
|
let {
|
||||||
|
images,
|
||||||
|
|
||||||
|
// path in which all images lie. this must be the same for all images. if left blank, "./" is used instead
|
||||||
|
path,
|
||||||
|
}: {
|
||||||
|
images: A11yImage[];
|
||||||
|
path?: string;
|
||||||
|
} = $props();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="image-gallery">
|
||||||
|
{#each images as i}
|
||||||
|
<a class="image-gallery-link" href="{path ?? "./"}/{i.src}">
|
||||||
|
<img class="image-gallery-img" loading="lazy" src="{path ?? "./"}/{i.src}" alt={i.alt}>
|
||||||
|
</a>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.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(100%) saturate(80%);
|
||||||
|
max-height: 320px;
|
||||||
|
transition: filter var(--duration-animation) var(--anim-curve),
|
||||||
|
scale var(--duration-animation) var(--anim-curve);
|
||||||
|
scale: 1.06;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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:hover .image-gallery-img {
|
||||||
|
filter: brightness(60%) saturate(80%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-gallery-link:hover .image-gallery-img {
|
||||||
|
filter: brightness(100%) saturate(100%);
|
||||||
|
scale: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-gallery-link:hover {
|
||||||
|
outline-color: var(--color-highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 800px) {
|
||||||
|
.image-gallery-link:hover {
|
||||||
|
outline-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-gallery-img {
|
||||||
|
border-radius: 0;
|
||||||
|
scale: 1.0;
|
||||||
|
filter: brightness(100%) saturate(100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
<a class="link-level-2" href="/projects/projectn5">Homesick</a>
|
<a class="link-level-2" href="/projects/projectn5">Homesick</a>
|
||||||
<a href="/feed">Feed</a>
|
<a href="/feed">Feed</a>
|
||||||
<a href="/blog">Blog</a>
|
<a href="/blog">Blog</a>
|
||||||
|
<a href="/drawings">Drawing Gallery</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="content-box">
|
<div class="content-box">
|
||||||
<h6>Meta</h6>
|
<h6>Meta</h6>
|
||||||
@@ -128,6 +129,7 @@
|
|||||||
|
|
||||||
.commit {
|
.commit {
|
||||||
display: inline;
|
display: inline;
|
||||||
|
font-size: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 800px) {
|
@media screen and (max-width: 800px) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<a href="/projects">projects</a>
|
<a href="/projects">projects</a>
|
||||||
<a href="/feed">feed</a>
|
<a href="/feed">feed</a>
|
||||||
<a href="/blog">blog</a>
|
<a href="/blog">blog</a>
|
||||||
|
<a href="/drawings">drawings</a>
|
||||||
<a href="/meta/about">about</a>
|
<a href="/meta/about">about</a>
|
||||||
{/snippet}
|
{/snippet}
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,16 @@
|
|||||||
import { posts as blogPosts } from "./blog/posts";
|
import { posts as blogPosts } from "./blog/posts";
|
||||||
// import IndieButton from "$lib/components/indie-button.svelte";
|
// import IndieButton from "$lib/components/indie-button.svelte";
|
||||||
// import { buttons } from "$lib/components/indie-button";
|
// import { buttons } from "$lib/components/indie-button";
|
||||||
import { getContext, onMount, setContext } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { getLatestPostDate } from "./feed/feed";
|
import { getLatestPostDate } from "./feed/feed";
|
||||||
|
import { drawings } from "./drawings/drawings";
|
||||||
|
|
||||||
let latestDevlogDate = devlogPosts[0].post.date;
|
let latestDevlogDate = devlogPosts[0].post.date;
|
||||||
let latestBlogDate = blogPosts[0].post.date;
|
|
||||||
|
// this only fetches the updated date if the latest post has been updated
|
||||||
|
let latestBlogDate = blogPosts[0].post.dateUpdated ?? blogPosts[0].post.date;
|
||||||
|
|
||||||
|
let latestDrawingDate = drawings[drawings.length - 1].date;
|
||||||
|
|
||||||
let latestStatusContent = $state("fetching status...");
|
let latestStatusContent = $state("fetching status...");
|
||||||
let latestStatusTimestamp = $state("?");
|
let latestStatusTimestamp = $state("?");
|
||||||
@@ -122,12 +127,20 @@
|
|||||||
link: "blog",
|
link: "blog",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Files",
|
title: "Drawing Gallery",
|
||||||
description: "find things I've put for download on my copyparty instance.",
|
description: "a collection of my digital and physical drawings.",
|
||||||
img: "main/hypertext.webp",
|
latestUpdate: latestDrawingDate,
|
||||||
altText: "Screenshot of Hypertext Unity level. Crates are strewn across the floor, Waluigi is flying in front of the camera, and text such as 'COME AND TRY OUR ALL-NEW BLENDER' and 'omg! it's the brandenbur ger tor!' is displayed.",
|
img: "drawings/banner.webp",
|
||||||
link: "https://files.natconf.dev/public/",
|
altText: "Several Faber-Castell Polychromos colour pencils lined up with markings next to them in the same colour on a sheet of paper.",
|
||||||
|
link: "drawings",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// title: "Files",
|
||||||
|
// description: "find things I've put for download on my copyparty instance.",
|
||||||
|
// img: "main/hypertext.webp",
|
||||||
|
// altText: "Screenshot of Hypertext Unity level. Crates are strewn across the floor, Waluigi is flying in front of the camera, and text such as 'COME AND TRY OUR ALL-NEW BLENDER' and 'omg! it's the brandenbur ger tor!' is displayed.",
|
||||||
|
// link: "https://files.natconf.dev/public/",
|
||||||
|
// },
|
||||||
]} />
|
]} />
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
@@ -107,10 +107,13 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
filter: brightness(70%) saturate(60%);
|
filter: brightness(70%) saturate(60%);
|
||||||
transition: filter var(--duration-animation) var(--anim-curve);
|
outline: var(--border-style) var(--border-dash-size) transparent;
|
||||||
|
transition: filter var(--duration-animation) var(--anim-curve),
|
||||||
|
outline-color var(--duration-animation) var(--anim-curve);
|
||||||
}
|
}
|
||||||
.img-button:hover {
|
.img-button:hover {
|
||||||
filter: brightness(100%) saturate(100%);
|
filter: brightness(100%) saturate(100%);
|
||||||
|
outline-color: var(--color-highlight);
|
||||||
}
|
}
|
||||||
|
|
||||||
.img-button img {
|
.img-button img {
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
import Content from "$lib/viewport/content.svelte";
|
import Content from "$lib/viewport/content.svelte";
|
||||||
import Banner2 from "$lib/banner2.svelte";
|
import Banner2 from "$lib/banner2.svelte";
|
||||||
import TableOfContents from "$lib/components/table-of-contents.svelte";
|
import TableOfContents from "$lib/components/table-of-contents.svelte";
|
||||||
|
import ImageRow from "$lib/media/image-row.svelte";
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
<title>Art Feed | denizk0461</title>
|
<title>Creative Feed | denizk0461</title>
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
{#snippet pageButtons(currentIndex: number)}
|
{#snippet pageButtons(currentIndex: number)}
|
||||||
@@ -34,7 +35,7 @@
|
|||||||
<Banner2
|
<Banner2
|
||||||
title="Creative Feed"
|
title="Creative Feed"
|
||||||
banner="banner.webp"
|
banner="banner.webp"
|
||||||
bannerAlt="Mirror picture of me, pixelated beyond recognition"
|
bannerAlt="A blue screen with the text 'how do you do art ? 1. face your fears 2. become your heroes'. The 'art' looks to have been edited in. The music artist Porter Robinson is standing in the bottom right corner."
|
||||||
subtitle="minor things I have worked on"
|
subtitle="minor things I have worked on"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -52,13 +53,10 @@
|
|||||||
<p class="subtitle">{post.metadata.date}</p>
|
<p class="subtitle">{post.metadata.date}</p>
|
||||||
<svelte:component this={post.content} />
|
<svelte:component this={post.content} />
|
||||||
{#if post.metadata.images && post.metadata.images.length > 0}
|
{#if post.metadata.images && post.metadata.images.length > 0}
|
||||||
<div class="image-gallery">
|
<ImageRow
|
||||||
{#each post.metadata.images as i, index}
|
images={post.metadata.images}
|
||||||
<a class="image-gallery-link" href="{post.metadata.id}/{i.src}">
|
path={post.metadata.id}
|
||||||
<img class="image-gallery-img" loading="lazy" src="{post.metadata.id}/{i.src}" alt={i.alt}>
|
/>
|
||||||
</a>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
|
|
||||||
@@ -115,42 +113,6 @@
|
|||||||
background-color: var(--color-background-highlight-alt);
|
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 {
|
.subtitle {
|
||||||
font-family: var(--font-mono);
|
font-family: var(--font-mono);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -168,20 +130,4 @@
|
|||||||
.subtitle::after {
|
.subtitle::after {
|
||||||
content: " -->";
|
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>
|
</style>
|
||||||
@@ -1,15 +1,12 @@
|
|||||||
|
import { type A11yImage } from "$lib/media/a11y-img";
|
||||||
|
|
||||||
export interface FeedEntry {
|
export interface FeedEntry {
|
||||||
id: string;
|
id: string;
|
||||||
title: string;
|
title: string;
|
||||||
subtitle: string;
|
subtitle: string;
|
||||||
date: string;
|
date: string;
|
||||||
posted: string;
|
posted: string;
|
||||||
images: FeedImage[];
|
images: A11yImage[];
|
||||||
}
|
|
||||||
|
|
||||||
interface FeedImage {
|
|
||||||
src: string;
|
|
||||||
alt: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export let entries: FeedEntry[] = [
|
export let entries: FeedEntry[] = [
|
||||||
|
|||||||
Reference in New Issue
Block a user