This commit is contained in:
parent
b554e92e9f
commit
ca6ba2eb51
13 changed files with 15 additions and 15 deletions
|
|
@ -61,7 +61,7 @@ const videoHeight = item.type === 'video' ? (item.poster?.height ?? 720) : undef
|
||||||
src={item.src}
|
src={item.src}
|
||||||
alt={item.decorative ? '' : (item.alt ?? '')}
|
alt={item.decorative ? '' : (item.alt ?? '')}
|
||||||
formats={['avif', 'webp']}
|
formats={['avif', 'webp']}
|
||||||
widths={[480, 720, 960, 1280, 1600, 1920]}
|
widths={[480, 960, 1280, 1920]}
|
||||||
sizes="(max-width: 700px) calc(100vw - 2 * clamp(20px, 4vw, 32px)), (max-width: 1100px) min(calc(100vw - 4rem), 56rem), 56rem"
|
sizes="(max-width: 700px) calc(100vw - 2 * clamp(20px, 4vw, 32px)), (max-width: 1100px) min(calc(100vw - 4rem), 56rem), 56rem"
|
||||||
quality="high"
|
quality="high"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ for (const root of document.querySelectorAll('.post-thumbnail--iframe')) {
|
||||||
alt={post.data.thumbnail.alt}
|
alt={post.data.thumbnail.alt}
|
||||||
formats={['avif', 'webp']}
|
formats={['avif', 'webp']}
|
||||||
fallbackFormat="jpg"
|
fallbackFormat="jpg"
|
||||||
widths={[640, 960, 1280, 1600, 1920]}
|
widths={[640, 960, 1280, 1920]}
|
||||||
sizes="(max-width: 700px) calc(100vw - 3rem), (max-width: 1100px) calc(100vw - 4rem), 56rem"
|
sizes="(max-width: 700px) calc(100vw - 3rem), (max-width: 1100px) calc(100vw - 4rem), 56rem"
|
||||||
quality="high"
|
quality="high"
|
||||||
loading="eager"
|
loading="eager"
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ const linkSchema = z.object({
|
||||||
const thumbnailSchema = ({ image }: SchemaContext) =>
|
const thumbnailSchema = ({ image }: SchemaContext) =>
|
||||||
z.object({
|
z.object({
|
||||||
src: image(),
|
src: image(),
|
||||||
alt: z.string(),
|
alt: z.string().min(1, 'Thumbnail alt text must not be empty.'),
|
||||||
});
|
});
|
||||||
|
|
||||||
const mediaSchema = ({ image }: SchemaContext) =>
|
const mediaSchema = ({ image }: SchemaContext) =>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: A Physics Practice App for the Hungarian Érettségi
|
title: A Physics Practice App for the Hungarian Érettségi
|
||||||
description: A static jQuery site I built in high school to drill past exam questions. 659 questions, more than a decade of past papers, still online and still used.
|
description: A static jQuery site I built in high school to drill past exam questions. 659 questions, a decade of past papers, still online and still used.
|
||||||
date: 2026-05-28
|
date: 2026-05-28
|
||||||
projectPeriod: '2017-2018'
|
projectPeriod: '2017-2018'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: An E-Ink Photo Frame That Sleeps When the House Is Empty
|
title: An E-Ink Photo Frame That Sleeps When the House Is Empty
|
||||||
description: A Pi, a 6-colour e-ink panel, and a self-hosted Immich library. Photos chosen by date and favourites, gated on Home Assistant presence, dithered with Atkinson.
|
description: A Pi, a 6-colour e-ink panel, and a self-hosted Immich library. Photos picked by date and favourites, gated on Home Assistant presence, Atkinson-dithered.
|
||||||
date: 2026-05-27
|
date: 2026-05-27
|
||||||
projectPeriod: '2026'
|
projectPeriod: '2026'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: A JavaFX Editor for the Cooling Simulator
|
title: A JavaFX Editor for the Cooling Simulator
|
||||||
description: The companion editor for the cooling-system sim. Drag-and-drop graph layout, JSON export, upload-to-backend. Small tool, mattered more than I expected.
|
description: Companion editor for the cooling-system sim. Drag-and-drop graph layout, JSON export, upload-to-backend. Small tool, mattered more than I expected.
|
||||||
date: 2026-04-25
|
date: 2026-04-25
|
||||||
projectPeriod: 'October-November 2018'
|
projectPeriod: 'October-November 2018'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: 'Two Graphs Are Simpler Than One: A Cooling System Simulator'
|
title: 'Two Graphs Are Simpler Than One: A Cooling System Simulator'
|
||||||
description: A live cooling-system sim for a PLC cybersecurity event. Splitting flow and heat into two graph passes kept the calculation cheap and the behaviour believable.
|
description: Live cooling-system sim for a PLC cybersecurity event. Splitting flow and heat into two graph passes kept it cheap and the behaviour believable.
|
||||||
date: 2026-05-04
|
date: 2026-05-04
|
||||||
projectPeriod: 'October-November 2018'
|
projectPeriod: 'October-November 2018'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: 25 Million UK Property Rows in a Single Rust Process
|
title: 25 Million UK Property Rows in a Single Rust Process
|
||||||
description: Notes on the perfect-postcode.co.uk server. Every numeric feature is u16-quantised in a flat row-major array, so filter eval is two integer compares per row.
|
description: Notes on perfect-postcode.co.uk. Every numeric feature is u16-quantised in a row-major array, so filter eval is two integer compares per row.
|
||||||
date: 2026-05-28
|
date: 2026-05-28
|
||||||
projectPeriod: '2026'
|
projectPeriod: '2026'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: A 3D Voxel Game in C, Built While Learning Pointers
|
title: A 3D Voxel Game in C, Built While Learning Pointers
|
||||||
description: My Basics of Programming course project. 3D platformer in C with SDL 1.2, destructible terrain, time-slowdown powerups, and a great many segmentation faults.
|
description: My Basics of Programming project. 3D platformer in C with SDL 1.2, destructible terrain, time-slowdown powerups, and a great many segmentation faults.
|
||||||
date: 2026-04-28
|
date: 2026-04-28
|
||||||
projectPeriod: 'Autumn 2017'
|
projectPeriod: 'Autumn 2017'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: A 3-Way Text Merger That Never Shows Conflict Markers
|
title: A 3-Way Text Merger That Never Shows Conflict Markers
|
||||||
description: reconcile-text merges Markdown notes from three editors I don't control, with no operation history. Here's why git, CRDTs, and diff-match-patch each failed me.
|
description: reconcile-text merges Markdown notes from three editors I don't control, with no history. Why git, CRDTs, and diff-match-patch each failed me.
|
||||||
date: 2026-05-21
|
date: 2026-05-21
|
||||||
projectPeriod: '2025'
|
projectPeriod: '2025'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: A 2D Ray Tracer for the Browser, Tuned for the Phone in Your Pocket
|
title: A 2D Ray Tracer for the Browser, Tuned for the Phone in Your Pocket
|
||||||
description: 'My BSc thesis library. The mobile GPU constraint shaped the architecture: tile-based passes, deferred shading, shaders generated per scene and device.'
|
description: 'My BSc thesis library. The mobile GPU shaped the architecture: tile-based passes, deferred shading, shaders generated per scene and device.'
|
||||||
date: 2026-05-08
|
date: 2026-05-08
|
||||||
projectPeriod: 'Autumn-Winter 2020'
|
projectPeriod: 'Autumn-Winter 2020'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: An Obsidian Sync Built Around the Merger I Already Had
|
title: An Obsidian Sync Built Around the Merger I Already Had
|
||||||
description: 'VaultLink: self-hosted Obsidian sync. Edit in any editor, online or off, then come back to a converged vault. The application that justified reconcile-text.'
|
description: 'VaultLink: self-hosted Obsidian sync. Edit in any editor, online or off, then come back to a converged vault. The app that justified reconcile-text.'
|
||||||
date: 2026-05-30
|
date: 2026-05-30
|
||||||
projectPeriod: '2025-2026'
|
projectPeriod: '2025-2026'
|
||||||
thumbnail:
|
thumbnail:
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,13 @@
|
||||||
4.5:1 for normal text). Darken-on-light / lighten-on-dark slightly from
|
4.5:1 for normal text). Darken-on-light / lighten-on-dark slightly from
|
||||||
the previous values that fell just below threshold. */
|
the previous values that fell just below threshold. */
|
||||||
--color-muted: light-dark(#3d3b35, #aaa299);
|
--color-muted: light-dark(#3d3b35, #aaa299);
|
||||||
--color-link: light-dark(#285f74, #7fa8b7);
|
--color-link: light-dark(#1e4d5e, #7fa8b7);
|
||||||
--color-link-hover: light-dark(
|
--color-link-hover: light-dark(
|
||||||
color-mix(in oklch, #285f74 70%, black 30%),
|
color-mix(in oklch, #1e4d5e 70%, black 30%),
|
||||||
color-mix(in oklch, #7fa8b7 80%, white 20%)
|
color-mix(in oklch, #7fa8b7 80%, white 20%)
|
||||||
);
|
);
|
||||||
--color-accent: light-dark(oklch(55% 0.13 15), oklch(68% 0.11 15));
|
--color-accent: light-dark(oklch(55% 0.13 15), oklch(68% 0.11 15));
|
||||||
--color-rule: light-dark(#d9d5ca, #5a5247);
|
--color-rule: light-dark(#bcb5a3, #5a5247);
|
||||||
--color-rule-medium: light-dark(#7a7466, #70695f);
|
--color-rule-medium: light-dark(#7a7466, #70695f);
|
||||||
--color-rule-strong: light-dark(#4a4340, #aaa196);
|
--color-rule-strong: light-dark(#4a4340, #aaa196);
|
||||||
--color-code-bg: light-dark(#efede6, #2a2824);
|
--color-code-bg: light-dark(#efede6, #2a2824);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue