From 0d8c2b017631e3c0c1639cb336d21b484d3613c8 Mon Sep 17 00:00:00 2001 From: Pascal Riesinger Date: Wed, 4 Nov 2026 12:19:27 +0100 Subject: [PATCH 1/3] Redesign the site with a shared Pocket ID-inspired theme Unify layouts, typography, responsive styling, native page transitions, and P/R branding. Refresh favicon assets and reference-table presentation. --- README.md | 61 +- assets/css/base.css | 138 ++++ assets/css/main.css | 1233 ++++------------------------- assets/js/page-transitions.js | 58 ++ content/acriss.md | 58 +- layouts/404.html | 15 +- layouts/_default/baseof.html | 2 +- layouts/_default/single.html | 13 +- layouts/index.html | 38 +- layouts/partials/cadence.html | 44 - layouts/partials/entries.html | 10 +- layouts/partials/footer.html | 9 +- layouts/partials/head.html | 8 + layouts/partials/header.html | 9 +- layouts/partials/icon.html | 13 + layouts/partials/nav.html | 4 +- layouts/partials/projects.html | 4 +- layouts/partials/tags.html | 8 +- layouts/posts/list.html | 16 +- layouts/posts/single.html | 23 +- layouts/projects/list.html | 6 +- layouts/projects/single.html | 27 +- layouts/taxonomy.html | 30 + layouts/taxonomy/tag.html | 13 - layouts/taxonomy/taxonomy.html | 23 - layouts/term.html | 18 + public/android-chrome-192x192.png | 4 +- public/android-chrome-512x512.png | 4 +- public/apple-touch-icon.png | 4 +- public/favicon-16x16.png | 4 +- public/favicon-32x32.png | 4 +- public/favicon.ico | Bin 15406 -> 15086 bytes public/site.webmanifest | 22 +- static/android-chrome-192x192.png | 4 +- static/android-chrome-512x512.png | 4 +- static/apple-touch-icon.png | 4 +- static/favicon-16x16.png | 4 +- static/favicon-32x32.png | 4 +- static/favicon.ico | Bin 15406 -> 15086 bytes static/icon.svg | 14 + static/site.webmanifest | 22 +- 41 files changed, 654 insertions(+), 1325 deletions(-) create mode 100644 assets/css/base.css create mode 100644 assets/js/page-transitions.js delete mode 100644 layouts/partials/cadence.html create mode 100644 layouts/partials/icon.html create mode 100644 layouts/taxonomy.html delete mode 100644 layouts/taxonomy/tag.html delete mode 100644 layouts/taxonomy/taxonomy.html create mode 100644 layouts/term.html create mode 100644 static/icon.svg diff --git a/README.md b/README.md index c64486f..80f0d91 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,60 @@ Hi there 👋 You've found my personal website and blog. -Currently, it's built using: +Built with Hugo and plain CSS; served by Caddy. -- Next.JS -- TailwindCSS -- MDX via Remark -- Vercel +## Local development + +Run `hugo server` and open `http://localhost:1313/`. Use `hugo` for a production build. + +## Design system + +All pages use the Pocket ID-inspired theme: locally hosted Instrument Serif for +the homepage name and main page titles, system sans-serif for section headings +and body text, neutral surfaces, rounded cards, and automatic light/dark modes. +No Tailwind or frontend build dependencies are needed. + +- `assets/css/base.css` owns shared theme tokens, typography, navigation, and footer. +- `assets/css/main.css` owns the homepage, archives, articles, projects, and reference tables. +- `layouts/partials/icon.html` contains the shared inline icons. + +The custom P/R monogram lives in `static/icon.svg`; this is the font-independent +vector master used in the personal-site header and as the SVG favicon. Its colors +adapt to light/dark preferences. PNG and ICO exports use the fixed dark tile; +the Apple touch icon is opaque so the platform can apply its own mask. + +Regenerate the raster exports with ImageMagick: + +```sh +magick -background none -density 1536 static/icon.svg -resize 1024x1024 \ + -depth 8 -strip /tmp/riesinger-icon-master.png +for size in 16 32; do + magick /tmp/riesinger-icon-master.png -resize "${size}x${size}" "static/favicon-${size}x${size}.png" +done +for size in 192 512; do + magick /tmp/riesinger-icon-master.png -resize "${size}x${size}" "static/android-chrome-${size}x${size}.png" +done +magick /tmp/riesinger-icon-master.png -resize 180x180 -background '#171717' \ + -alpha remove -alpha off static/apple-touch-icon.png +magick /tmp/riesinger-icon-master.png -define icon:auto-resize=48,32,16 static/favicon.ico +``` + +The main archive's tag filter is progressively enhanced: without JavaScript, +all entries remain visible. Wide reference pages use `wide: true` in frontmatter. + +Same-origin navigation uses native CSS View Transitions from `base.css`, with a +steady header and a quick page fade by default. Writing and project +card titles marked `data-transition-title` move into the destination `main h1` +over 320ms; the remaining content then fades in over 180ms. + +`assets/js/page-transitions.js` pairs only the selected title through the native +`pageswap` / `pagereveal` events. Its classic script deliberately loads in the +head before the first render; do not add `async`, `defer`, or `type="module"`. +It hands off an ephemeral source/destination URL pair through session storage, +consumes it on arrival, and clears temporary transition names when finished. +New card title markers must be inside their destination links. + +Reduced-motion preferences disable all page transitions. Without JavaScript, +the required browser APIs, or session storage, navigation keeps the basic fade +where supported, otherwise ordinary page changes. No client-side router is used; +same-page anchors and opening links in a new tab retain their native behavior. diff --git a/assets/css/base.css b/assets/css/base.css new file mode 100644 index 0000000..90d297d --- /dev/null +++ b/assets/css/base.css @@ -0,0 +1,138 @@ +/* Shared Pocket ID-inspired typography, surfaces and site chrome. */ +@font-face { + font-family: "Instrument Serif"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("/fonts/InstrumentSerif-Regular.woff2") format("woff2"); +} + +:root { + color-scheme: light dark; + --background: #ffffff; + --surface: #fafafa; + --soft: #f2f2f2; + --border: #e5e5e5; + --muted: #666666; + --ink: #171717; + --display: "Instrument Serif", Georgia, serif; + --body: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #111111; + --surface: #181818; + --soft: #242424; + --border: #333333; + --muted: #aaaaaa; + --ink: #f5f5f5; + } +} + +*, *::before, *::after { box-sizing: border-box; } +html { scroll-behavior: smooth; scroll-padding-top: 2rem; -webkit-text-size-adjust: 100%; } +body { margin: 0; min-height: 100svh; display: flex; flex-direction: column; background: var(--background); color: var(--ink); font: 16px/1.6 var(--body); -webkit-font-smoothing: antialiased; } +body > main { flex: 1; } +a { color: inherit; text-underline-offset: .2em; } +svg { flex-shrink: 0; vertical-align: middle; } +img, video, audio { max-width: 100%; } +h1, h2, h3, h4, h5, h6, p { margin: 0; } +h1 { font: 400 clamp(42px, 5.3vw, 66px)/1.06 var(--display); letter-spacing: -.025em; text-wrap: balance; } +:focus-visible { outline: 2px solid var(--ink); outline-offset: 5px; } +[hidden] { display: none !important; } +.frame { width: min(1120px, calc(100% - 64px)); margin-inline: auto; } +.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } +.skip-link { position: fixed; top: 12px; left: 12px; padding: 10px 20px; background: var(--ink); color: var(--background); border-radius: 24px; transform: translateY(-180%); z-index: 10; } +.skip-link:focus { transform: translateY(0); } +.site-header { min-height: 100px; display: flex; align-items: center; justify-content: space-between; gap: 24px; border-bottom: 1px solid var(--border); } +.brand { display: inline-flex; align-items: center; gap: 12px; text-decoration: none; font-weight: 600; font-size: 15px; } +.brand-mark { display: grid; place-items: center; flex-shrink: 0; width: 38px; height: 38px; border-radius: 12px; background: var(--ink); color: var(--background); } +.brand-mark img { display: block; width: 100%; height: 100%; } +.site-header nav { display: flex; gap: 6px; font-size: 14px; } +.site-header nav a { display: block; padding: 8px 16px; text-decoration: none; border-radius: 24px; color: var(--muted); } +.site-header nav a[aria-current="page"] { background: var(--soft); color: var(--ink); } +.site-header nav a:hover { color: var(--ink); background: var(--surface); } +.eyebrow { display: block; margin-bottom: 14px; font-size: 12px; font-weight: 600; color: var(--muted); letter-spacing: .07em; text-transform: uppercase; } +.button { display: inline-flex; align-items: center; justify-content: center; gap: 14px; border-radius: 30px; background: var(--ink); color: var(--background); text-decoration: none; font-size: 14px; font-weight: 500; padding: 12px 20px; margin-top: 28px; } +.button:hover { opacity: .82; } +.back-link { display: inline-flex; align-items: center; gap: 8px; color: var(--muted); text-decoration: none; font-size: 13px; } +.back-link svg { width: 16px; height: 16px; } +.back-link:hover { color: var(--ink); } +.site-footer { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding-block: 26px; border-top: 1px solid var(--border); margin-top: 64px; color: var(--muted); font-size: 12px; } +.site-footer a { white-space: nowrap; text-decoration: none; } +.site-footer a:hover { color: var(--ink); } +.site-footer svg { width: 13px; height: 13px; margin-left: 4px; } + +@media (max-width: 760px) { + .frame { width: calc(100% - 40px); } + .site-header { min-height: 88px; gap: 12px; } + .brand { font-size: 13px; gap: 8px; } + .brand-mark { width: 32px; height: 32px; border-radius: 10px; } + .site-header nav { gap: 0; font-size: 12px; } + .site-header nav a { padding: 7px 10px; } + .site-footer { align-items: flex-start; } +} +@media (max-width: 480px) { + .frame { width: calc(100% - 32px); } + .site-footer { flex-direction: column; gap: 12px; margin-top: 48px; } +} +/* Native same-origin navigation: fade the page while keeping the header steady. + Root snapshots avoid scaling content between wide and narrow page layouts. */ +@media (prefers-reduced-motion: no-preference) { + @view-transition { navigation: auto; } + + body > .site-header { view-transition-name: site-header; } + ::view-transition-group(root), + ::view-transition-group(site-header) { animation: none; } + ::view-transition-old(site-header) { display: none; } + ::view-transition-new(site-header) { animation: none; } + ::view-transition-old(root) { + animation: 140ms ease-out both page-out; + mix-blend-mode: normal; + } + ::view-transition-new(root) { + animation: 180ms ease-out both page-in; + mix-blend-mode: normal; + } + + /* A card title travels first; the rest of the destination follows it. */ + ::view-transition-group(page-title) { + animation-duration: 320ms; + animation-timing-function: cubic-bezier(.22, .61, .36, 1); + z-index: 1; + } + ::view-transition-old(page-title) { + animation: 140ms ease-out both heading-out; + mix-blend-mode: normal; + } + ::view-transition-new(page-title) { + animation: 320ms ease-out both heading-in; + mix-blend-mode: normal; + } + :root[data-heading-transition]::view-transition-new(root) { + animation-delay: 320ms; + } + + @keyframes heading-out { + to { opacity: 0; } + } + @keyframes heading-in { + from { opacity: 0; } + to { opacity: 1; } + } + + @keyframes page-out { + to { opacity: 0; transform: translateY(-4px); } + } + @keyframes page-in { + from { opacity: 0; transform: translateY(6px); } + to { opacity: 1; transform: translateY(0); } + } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + *, *::before, *::after { animation: none !important; transition: none !important; } +} diff --git a/assets/css/main.css b/assets/css/main.css index 5744613..0ac0631 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -1,1080 +1,155 @@ -/* --------------------------------------------------------------------------- - riesinger.dev — "logbook" - One typeface (iA Writer Quattro, a writing-tool face) carries everything. - A margin rail holds dates, labels and tags; prose keeps its own column. ---------------------------------------------------------------------------- */ - -@font-face { - font-family: "iA Writer Quattro"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(/fonts/iAWriterQuattroS-Regular.woff2) format("woff2"); -} - -@font-face { - font-family: "iA Writer Quattro"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url(/fonts/iAWriterQuattroS-Italic.woff2) format("woff2"); -} - -@font-face { - font-family: "iA Writer Quattro"; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(/fonts/iAWriterQuattroS-Bold.woff2) format("woff2"); -} - -@font-face { - font-family: "iA Writer Quattro"; - font-style: italic; - font-weight: 700; - font-display: swap; - src: url(/fonts/iAWriterQuattroS-BoldItalic.woff2) format("woff2"); -} - -:root { - color-scheme: light dark; - - --font-body: - "iA Writer Quattro", ui-sans-serif, system-ui, -apple-system, - "Segoe UI", sans-serif; - --font-mono: - ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; - - --paper: #f0f1f4; - --panel: #f8f9fb; - --ink: #15171c; - --ink-2: #383c45; - --muted: #61666f; - --rule: #d9dbe2; - --rule-strong: #bfc3cc; - --accent: #2645d8; - --accent-soft: rgba(38, 69, 216, 0.3); - --accent-wash: rgba(38, 69, 216, 0.08); - - --gutter: 7.5rem; - --gap: 2.5rem; - --read: 44rem; - --pad: 1.5rem; - - /* The content frame widens on reference pages; the chrome frame never does, - so the header and footer are identical on every page. */ - --frame: 54rem; - --frame-chrome: 54rem; -} - -/* Reference pages (wide tables, data dumps) get a wider content frame. Running - text stays at the reading measure so only the tables use the extra room. */ -body.wide { - --frame: 70rem; -} - -/* These pages carry no margin metadata, so the rail collapses; left in place its - empty gutter would push the content off-centre inside the wider frame. */ -body.wide > main::before { - display: none; -} - -body.wide .rail { - grid-template-columns: minmax(0, 1fr); - column-gap: 0; -} - -body.wide .rail > *, -body.wide .rail > .rail-aside { - grid-column: 1; -} - -body.wide .prose > p, -body.wide .prose > ul, -body.wide .prose > ol, -body.wide .prose > blockquote, -body.wide .prose > h2, -body.wide .prose > h3, -body.wide .doc-subtitle { - max-width: var(--read); -} - -@media (prefers-color-scheme: dark) { - :root { - --paper: #111318; - --panel: #191c22; - --ink: #e9ebf0; - --ink-2: #b5bac4; - --muted: #8a9099; - --rule: #262932; - --rule-strong: #3a3e49; - --accent: #93a5ff; - --accent-soft: rgba(147, 165, 255, 0.36); - --accent-wash: rgba(147, 165, 255, 0.1); - } -} - -/* --------------------------------------------------------------- base ---- */ - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: var(--font-body); - font-variant-numeric: tabular-nums; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; - padding: 0; - background: var(--paper); - color: var(--ink-2); - font-size: 1.09375rem; - line-height: 1.7; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - color: inherit; - text-decoration: none; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - color: var(--ink); - font-weight: 700; - letter-spacing: -0.02em; - line-height: 1.15; - text-wrap: balance; -} - -::selection { - background: var(--accent); - color: var(--paper); -} - -:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 3px; - border-radius: 2px; -} - -img, -video, -figure { - max-width: 100%; -} - -.skip-link { - position: absolute; - left: -9999px; - top: 0; - z-index: 10; - padding: 0.6rem 1rem; - background: var(--accent); - color: var(--paper); - font-size: 0.8125rem; -} - -.skip-link:focus { - left: 0.5rem; - top: 0.5rem; -} - -/* ------------------------------------------------------------- shell ---- */ - -body > header, -body > footer, -body > main { - width: 100%; - max-width: calc(var(--frame) + var(--pad) * 2); - margin-inline: auto; - padding-inline: var(--pad); -} - -/* Centred on the chrome frame rather than the content frame, so a wide page's - header sits in exactly the same place as every other page's. */ -body > header, -body > footer { - max-width: calc(var(--frame-chrome) + var(--pad) * 2); -} - -body > main { - position: relative; - padding-bottom: 4rem; -} - -/* The margin rail: a ruled notebook line separating metadata from prose. */ -body > main::before { - content: ""; - position: absolute; - top: 0; - bottom: 3rem; - left: calc(var(--pad) + var(--gutter) + var(--gap) / 2); - width: 1px; - background: var(--rule); -} - -.site-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 1.5rem; - padding-block: 1.75rem 3.5rem; -} - -.wordmark { - font-size: 1rem; - font-weight: 700; - letter-spacing: -0.01em; - color: var(--ink); -} - -.wordmark span { - color: var(--accent); - font-weight: 400; -} - -.wordmark:hover { - color: var(--accent); -} - -.site-nav ul { - display: flex; - gap: 1.5rem; - margin: 0; - padding: 0; - list-style: none; -} - -.site-nav a { - font-size: 0.75rem; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.13em; - color: var(--muted); -} - -.site-nav a:hover { - color: var(--ink); -} - -.site-nav a[aria-current] { - color: var(--ink); - box-shadow: inset 0 -1px 0 0 var(--accent); -} - -.site-footer { - display: flex; - flex-wrap: wrap; - align-items: baseline; - justify-content: space-between; - gap: 0.75rem 1.5rem; - padding-block: 1.5rem 3rem; - border-top: 1px solid var(--rule); - font-size: 0.8125rem; - color: var(--muted); -} - -.site-footer a:hover { - color: var(--accent); -} - -/* -------------------------------------------------------- gutter grid ---- */ - -.rail { - display: grid; - grid-template-columns: var(--gutter) minmax(0, 1fr); - column-gap: var(--gap); - align-items: start; -} - -.rail > * { - grid-column: 2; -} - -.rail > .rail-aside { - grid-column: 1; -} - -.rail-gap { - margin-top: 2.25rem; -} - -.label { - font-size: 0.6875rem; - font-weight: 700; - line-height: 1.5; - text-transform: uppercase; - letter-spacing: 0.14em; - color: var(--muted); -} - -/* ------------------------------------------------------------- hero ---- */ - -.hero { - padding-bottom: 1rem; -} - -.hero-name { - margin: 0; - font-size: clamp(2.75rem, 11vw, 5.25rem); - line-height: 0.94; - letter-spacing: -0.045em; -} - -.hero-name .surname { - display: block; - color: var(--ink-2); -} - -.hero-lead { - max-width: 30rem; - margin: 1.75rem 0 0; - font-size: 1.125rem; - line-height: 1.6; - color: var(--ink-2); - text-wrap: pretty; -} - -.hero-lead p { - margin: 0; -} - -.hero-lead p + p { - margin-top: 0.9rem; -} - -.hero-lead a { - color: var(--ink); - text-decoration: underline; - text-decoration-color: var(--accent-soft); - text-decoration-thickness: 1px; - text-underline-offset: 0.2em; -} - -.hero-lead a:hover { - color: var(--accent); - text-decoration-color: var(--accent); -} - -/* ------------------------------------------------------- cadence plot ---- */ - -.cadence { - margin-top: 3.25rem; -} - -/* One mark per entry, stacked by year — a tally, not a dashboard. */ -.cadence-plot { - display: flex; - align-items: flex-end; - gap: 0.5rem; - min-height: 2.5rem; - padding-bottom: 0.4rem; - border-bottom: 1px solid var(--rule-strong); -} - -.cadence-year { - display: flex; - flex: 1; - flex-direction: column-reverse; - align-items: center; - gap: 4px; - min-width: 0; - animation: reveal 0.5s cubic-bezier(0.2, 0.7, 0.3, 1) backwards; -} - -.tally { - display: block; - width: 100%; - max-width: 1.75rem; - height: 6px; - border-radius: 1px; - background: var(--accent); -} - -.cadence-year[data-count="0"]::after { - content: ""; - display: block; - width: 100%; - max-width: 1.75rem; - height: 1px; - background: var(--rule-strong); -} - -.cadence-scale { - display: flex; - gap: 0.5rem; - margin-top: 0.5rem; -} - -.cadence-scale span { - flex: 1; - min-width: 0; - font-size: 0.625rem; - font-weight: 700; - letter-spacing: 0.04em; - color: var(--muted); - text-align: center; -} - -.cadence-total { - margin-top: 0.75rem; - font-size: 0.8125rem; - color: var(--muted); -} - -/* ------------------------------------------------------------ blocks ---- */ - -.block { - padding-block: 2.75rem; - border-top: 1px solid var(--rule); -} - -.rail.block-head { - align-items: baseline; - margin-bottom: 0.6rem; -} - -.block-head h2 { - margin: 0; -} - -.block-head .more { - justify-self: end; -} - -.more { - font-size: 0.75rem; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.12em; - color: var(--muted); - white-space: nowrap; -} - -.more:hover { - color: var(--accent); -} - -/* ------------------------------------------------------------ entries ---- */ - -.entries, -.projects { - margin: 1.5rem 0 0; - padding: 0; - border-top: 1px solid var(--rule); - list-style: none; -} - -.block .entries, -.block .projects { - margin-top: 0; -} - -.entry { - border-bottom: 1px solid var(--rule); -} - -.entry:last-child, -.project:last-child { - border-bottom: none; -} - -.entry-link { - display: grid; - grid-template-columns: var(--gutter) minmax(0, 1fr) auto; - column-gap: var(--gap); - align-items: baseline; - padding: 0.9rem 0.75rem; - margin-inline: -0.75rem; - transition: background-color 0.15s ease; -} - -.entry-link:hover { - background: var(--accent-wash); -} - -.entry-date { - font-size: 0.8125rem; - color: var(--muted); - font-variant-numeric: tabular-nums; -} - -.entry-title { - font-size: 1.0625rem; - font-weight: 700; - letter-spacing: -0.015em; - line-height: 1.35; - color: var(--ink); -} - -.entry-tags { - display: flex; - flex-wrap: wrap; - justify-content: flex-end; - gap: 0.5rem; - font-size: 0.75rem; - color: var(--muted); -} - -.entry-link:hover .entry-title { - color: var(--accent); -} - -.entry-link:hover .entry-date { - color: var(--ink-2); -} - -/* ----------------------------------------------------------- projects ---- */ - -.project { - border-bottom: 1px solid var(--rule); -} - -.project-link { - display: grid; - grid-template-columns: var(--gutter) minmax(0, 1fr); - column-gap: var(--gap); - align-items: start; - padding: 1.25rem 0.75rem; - margin-inline: -0.75rem; - transition: background-color 0.15s ease; -} - -.project-link:hover { - background: var(--accent-wash); -} - -.project-body { - grid-column: 2; -} - -.project-year { - grid-column: 1; - padding-top: 0.2rem; - font-size: 0.8125rem; - color: var(--muted); -} - -.project-title { - margin: 0; - font-size: 1.0625rem; - letter-spacing: -0.015em; -} - -.project-link:hover .project-title { - color: var(--accent); -} - -.project-summary { - margin: 0.25rem 0 0; - font-size: 0.9375rem; - line-height: 1.5; - color: var(--muted); -} - -.project-status { - margin: 0.5rem 0 0; -} - -.doc-meta .project-status { - margin: 0; -} - -.project-status::before { - content: ""; - display: inline-block; - width: 5px; - height: 5px; - margin-right: 0.5em; - border-radius: 50%; - background: var(--rule-strong); - vertical-align: 0.15em; -} - -.project-status[data-status="active"]::before { - background: var(--accent); -} - -/* -------------------------------------------------------------- prose ---- */ - -.prose { - color: var(--ink-2); - overflow-wrap: break-word; -} - -.prose > :first-child { - margin-top: 0; -} - -.about .prose > p:first-child { - color: var(--ink); -} - -.prose p, -.prose ul, -.prose ol, -.prose dl { - margin-block: 1.35em; -} - -.prose li + li { - margin-top: 0.4em; -} - -.prose h2 { - margin: 2.75rem 0 0.85rem; - font-size: 1.5rem; -} - -.prose h3 { - margin: 2.25rem 0 0.7rem; - font-size: 1.1875rem; -} - -.prose h4 { - margin: 1.85rem 0 0.5rem; - font-size: 1.0625rem; -} - -.prose h5, -.prose h6 { - margin: 1.75rem 0 0.5rem; - font-size: 0.6875rem; - text-transform: uppercase; - letter-spacing: 0.14em; - color: var(--muted); -} - -.prose a { - color: var(--ink); - text-decoration: underline; - text-decoration-color: var(--accent-soft); - text-decoration-thickness: 1px; - text-underline-offset: 0.2em; -} - -.prose a:hover { - color: var(--accent); - text-decoration-color: var(--accent); -} - -.prose strong { - color: var(--ink); -} - -.prose blockquote { - margin: 1.75rem 0; - padding-left: 1.25rem; - border-left: 2px solid var(--accent); - color: var(--muted); -} - -.prose blockquote p { - margin-block: 0.5em; -} - -.prose hr { - height: 1px; - margin: 2.75rem 0; - border: none; - background: var(--rule); -} - -.prose figure { - margin: 2rem 0; -} - -.prose img { - display: block; - border-radius: 3px; -} - -.prose figcaption { - margin-top: 0.6rem; - font-size: 0.8125rem; - line-height: 1.5; - color: var(--muted); -} - -.scroll-x { - overflow-x: auto; - overscroll-behavior-x: contain; -} - -.prose table { - width: 100%; - margin: 2rem 0; - border-collapse: collapse; - font-size: 0.9375rem; -} - -.prose th { - padding: 0.4rem 0.75rem; - border-bottom: 1px solid var(--rule-strong); - font-size: 0.6875rem; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.12em; - color: var(--muted); - text-align: left; -} - -.prose td { - padding: 0.45rem 0.75rem; - border-bottom: 1px solid var(--rule); - vertical-align: top; -} - -/* Markdown tables are ruled only along the bottom of each row, so the first - column can sit flush and line its text up with the surrounding prose. Tables - that draw their own cell borders opt back in to a left pad. */ -.prose tr > :first-child { - padding-left: 0; -} - -.prose sup a { - text-decoration: none; - color: var(--accent); -} - -.footnotes { - margin-top: 3rem; - padding-top: 1.25rem; - border-top: 1px solid var(--rule); - font-size: 0.9375rem; - color: var(--muted); -} - -/* --------------------------------------------------------------- code ---- */ - -code { - font-family: var(--font-mono); - font-size: 0.85em; -} - -:not(pre) > code { - padding: 0.1em 0.35em; - border: 1px solid var(--rule); - border-radius: 3px; - background: var(--panel); - color: var(--ink); -} - -.highlight { - margin: 1.75rem 0; -} - -pre { - margin: 1.75rem 0; - padding: 1.1rem 1.25rem; - overflow-x: auto; - border: 1px solid var(--rule); - border-radius: 4px; - background: var(--panel); - font-size: 0.8125rem; - line-height: 1.65; -} - -.highlight pre { - margin: 0; -} - -.chroma { - background: var(--panel) !important; -} - -/* -------------------------------------------------------- document page --- */ - -.doc-title { - margin: 0; - font-size: clamp(1.9rem, 6vw, 2.6rem); - letter-spacing: -0.035em; - line-height: 1.08; -} - -.doc-subtitle { - max-width: 32rem; - margin: 1rem 0 0; - font-size: 1.0625rem; - line-height: 1.55; - color: var(--muted); - text-wrap: pretty; -} - -.doc-meta { - display: flex; - flex-direction: column; - gap: 0.35rem; - padding-top: 0.6rem; - font-size: 0.8125rem; - line-height: 1.5; - color: var(--muted); -} - -.doc-meta .doc-meta-tags { - display: flex; - flex-direction: column; - gap: 0.2rem; - margin: 0; - padding: 0; - list-style: none; -} - -.doc-meta a:hover { - color: var(--accent); -} - -.doc-body { - margin-top: 2.75rem; -} - -.doc-hero { - margin: 2rem 0 0; -} - -.doc-hero img { - width: 100%; - border-radius: 3px; -} - -/* -------------------------------------------------------------- filter --- */ - -.filter-bar { - display: none; - margin-bottom: 1.5rem; -} - -.filter-bar.is-ready { - display: grid; -} - -.filter { - display: flex; - flex-wrap: wrap; - gap: 0.4rem; - margin: 0 0 1.75rem; - padding: 0; - list-style: none; -} - -.filter button { - padding: 0.28rem 0.7rem; - border: 1px solid var(--rule-strong); - border-radius: 999px; - background: transparent; - font: inherit; - font-size: 0.75rem; - line-height: 1.4; - color: var(--muted); - cursor: pointer; - transition: - color 0.15s ease, - border-color 0.15s ease, - background-color 0.15s ease; -} - -.filter button:hover { - color: var(--ink); - border-color: var(--ink-2); -} - -.filter .count { - opacity: 0.65; -} - -.filter-note { - margin: 0.7rem 0 0; - font-size: 0.8125rem; - color: var(--muted); -} - -.filter-note a { - text-decoration: underline; - text-decoration-color: var(--accent-soft); - text-underline-offset: 0.2em; -} - -.filter-note a:hover { - color: var(--accent); -} - -.filter button[aria-pressed="true"] { - background: var(--accent); - border-color: var(--accent); - color: var(--paper); -} - -.entry[hidden] { - display: none; -} - -.filter-empty { - margin: 2rem 0; - color: var(--muted); -} - -/* ------------------------------------------------------------ tag cloud --- */ - -.tag-cloud { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - margin: 0; - padding: 0; - list-style: none; -} - -.tag-cloud a { - display: inline-flex; - align-items: baseline; - gap: 0.45em; - padding: 0.3rem 0.75rem; - border: 1px solid var(--rule-strong); - border-radius: 999px; - font-size: 0.875rem; - color: var(--ink-2); -} - -.tag-cloud a:hover { - border-color: var(--accent); - color: var(--accent); -} - -.tag-cloud .count { - font-size: 0.75rem; - color: var(--muted); -} - -.tag-cloud a:hover .count { - color: var(--accent); -} - -/* ------------------------------------------------------------- motion ---- */ - -.reveal { - animation: reveal 0.55s cubic-bezier(0.2, 0.7, 0.3, 1) backwards; -} - -.reveal-2 { - animation-delay: 0.09s; -} - -.reveal-3 { - animation-delay: 0.18s; -} - -@keyframes reveal { - from { - opacity: 0; - transform: translateY(0.5rem); - } -} - -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.001ms !important; - animation-delay: 0ms !important; - transition-duration: 0.001ms !important; - } -} - -/* --------------------------------------------------------- narrow view --- */ - -@media (max-width: 46rem) { - :root { - --pad: 1.25rem; - } - - body > main::before { - display: none; - } - - .rail, - .entry-link, - .project-link { - grid-template-columns: minmax(0, 1fr); - column-gap: 0; - } - - .rail > *, - .rail > .rail-aside { - grid-column: 1; - } - - .rail > .rail-aside { - margin-bottom: 0.6rem; - } - - .entry-link { - grid-template-areas: - "meta" - "title"; - row-gap: 0.2rem; - padding-block: 1rem; - } - - .entry-date { - grid-area: meta; - } - - .entry-title { - grid-area: title; - } - - .entry-tags { - justify-content: flex-start; - margin-top: 0.35rem; - } - - .project-link { - grid-template-areas: - "year" - "body"; - row-gap: 0.35rem; - } - - .project-year { - grid-area: year; - grid-column: auto; - padding-top: 0; - } - - .project-body { - grid-area: body; - grid-column: auto; - } - - .project-thumb { - aspect-ratio: 16 / 7; - } - - .doc-meta { - flex-direction: row; - flex-wrap: wrap; - gap: 0.35rem 1.25rem; - padding-top: 0; - margin-bottom: 1.25rem; - } - - .doc-meta .doc-meta-tags { - flex-direction: row; - gap: 0.75rem; - } - - .site-header { - padding-block: 1.25rem 2.5rem; - } +/* Personal site layouts. Typography, theme and chrome are shared in base.css. */ +.site-nav ul, .footer-links { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; } +.footer-links { gap: 20px; } +.label { display: block; color: var(--muted); font-size: 12px; font-weight: 600; } + +/* Home: introduction, card collections, and a quieter personal note. */ +.hero { max-width: 760px; padding-block: 72px 68px; } +.hero h1 { font-size: clamp(48px, 6vw, 76px); } +.hero-lead { max-width: 600px; margin-top: 24px; color: var(--muted); font-size: 18px; line-height: 1.65; } +.hero-lead p + p { margin-top: 16px; } +.hero-lead a { color: var(--ink); } +.hero-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 16px 24px; margin-top: 28px; } +.hero-actions .button { margin: 0; } +.quiet-link, .more { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; color: var(--muted); font-size: 13px; } +.quiet-link svg, .more svg { width: 16px; height: 16px; } +.quiet-link:hover, .more:hover { color: var(--ink); } +.home-section + .home-section { margin-top: 48px; } +.section-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 20px; } +.section-heading h2 { font: 600 26px/1.25 var(--body); letter-spacing: -.025em; } +.section-heading p { margin-top: 6px; color: var(--muted); font-size: 14px; } +.more { flex-shrink: 0; } +.about-panel { display: grid; grid-template-columns: minmax(160px, 1fr) minmax(0, 2.6fr); gap: 40px; margin-top: 56px; padding: 36px; border: 1px solid var(--border); border-radius: 20px; background: var(--surface); } +.about-panel h2 { font: 600 28px/1.25 var(--body); letter-spacing: -.025em; } +.about-panel .prose { font-size: 15px; color: var(--muted); } +.about-panel .prose > :first-child { color: var(--ink); } +.about-panel .prose > :last-child { margin-bottom: 0; } + +/* Archive cards keep dates, tags, and project status visible. */ +.archive-page { padding-top: 64px; } +.page-heading { margin-bottom: 36px; } +.doc-title { overflow-wrap: anywhere; } +.doc-subtitle { max-width: 660px; margin-top: 20px; font-size: 18px; color: var(--muted); text-wrap: pretty; } +.page-heading .prose { max-width: 720px; margin-top: 24px; } +.entries, .projects { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin: 0; padding: 0; list-style: none; } +.projects { grid-template-columns: repeat(3, minmax(0, 1fr)); } +.entry, .project { min-width: 0; } +.entry-link, .project-link { position: relative; display: flex; flex-direction: column; height: 100%; padding: 26px; border: 1px solid var(--border); border-radius: 18px; text-decoration: none; transition: border-color 150ms ease, background-color 150ms ease; } +.entry-link:hover, .project-link:hover { border-color: var(--muted); background: var(--surface); } +.entry-date, .project-year { display: block; padding-right: 28px; color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; } +.entry-title, .project-title { display: block; margin-top: 16px; font: 600 20px/1.35 var(--body); letter-spacing: -.025em; overflow-wrap: anywhere; } +.entry-summary, .project-summary { margin-top: 12px; color: var(--muted); font-size: 14px; line-height: 1.6; } +.entry-tags { display: flex; flex-wrap: wrap; gap: 6px; padding-top: 20px; margin-top: auto; color: var(--muted); font-size: 11px; } +.entry-tags > span, .project-status { display: inline-flex; align-items: center; width: fit-content; padding: 3px 10px; border-radius: 20px; background: var(--soft); color: var(--muted); font-size: 11px; font-weight: 400; line-height: 1.6; } +.entry-arrow { position: absolute; top: 26px; right: 26px; color: var(--muted); } +.entry-arrow svg { width: 17px; height: 17px; } +.project-body { display: flex; flex-direction: column; flex: 1; align-items: flex-start; } +.project-status { gap: 6px; margin-top: 20px; } +.project-status::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: currentColor; } +.project-status[data-status="active"] { color: var(--ink); } + +/* Progressive enhancement: the full archive remains readable without JS. */ +.filter-bar { display: none; margin-bottom: 28px; } +.filter-bar.is-ready { display: block; } +.filter-bar > .label { margin-bottom: 12px; } +.filter { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; list-style: none; } +.filter button { display: inline-flex; align-items: baseline; gap: 6px; padding: 8px 14px; border: 1px solid transparent; border-radius: 24px; background: var(--soft); color: var(--muted); font: 13px/1.5 var(--body); cursor: pointer; } +.filter button:hover { border-color: var(--border); color: var(--ink); } +.filter button[aria-pressed="true"] { background: var(--ink); color: var(--background); } +.filter .count { font-size: 11px; opacity: .8; } +.filter-empty, .empty-state { padding: 28px; border: 1px solid var(--border); border-radius: 18px; background: var(--surface); color: var(--muted); } +.filter-empty { margin-top: 20px; } +.tag-cloud { display: flex; flex-wrap: wrap; gap: 12px; margin: 20px 0 0; padding: 0; list-style: none; } +.tag-cloud a { display: inline-flex; align-items: center; gap: 16px; border: 1px solid var(--border); border-radius: 24px; padding: 10px 18px; text-decoration: none; font-size: 15px; } +.tag-cloud a:hover { border-color: var(--muted); background: var(--surface); } +.tag-cloud .count { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; } + +/* Long-form pages keep the same shell, with a narrower reading measure. */ +.document-page { max-width: 820px; padding-top: 36px; } +.document-page > .page-heading { margin-top: 36px; } +.document-page > .page-heading:first-child { margin-top: 20px; } +.document-page .doc-title { font-size: clamp(40px, 5vw, 60px); } +.doc-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 18px; margin-bottom: 20px; color: var(--muted); font-size: 12px; } +.doc-meta .project-status { margin-top: 0; } +.doc-meta-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; } +.doc-meta-tags a, .doc-meta-tags > li > span { display: block; padding: 3px 10px; border-radius: 20px; background: var(--soft); color: var(--muted); text-decoration: none; font-size: 11px; } +.doc-meta-tags a:hover { color: var(--ink); } +.doc-body { max-width: 720px; margin-top: 36px; } +.doc-hero { margin: 32px 0; } +.doc-hero img { display: block; width: 100%; height: auto; border-radius: 18px; } +.reference-page { max-width: 1120px; } +.reference-page .doc-body { max-width: none; } +.reference-page .prose > p, .reference-page .prose > ul, .reference-page .prose > ol { max-width: 720px; } + +/* Markdown content: images, code, tables, quotes and footnotes. */ +.prose { overflow-wrap: break-word; line-height: 1.75; } +.prose > :first-child { margin-top: 0; } +.prose p, .prose ul, .prose ol, .prose dl { margin-block: 1.25em; } +.prose li + li { margin-top: .4em; } +.prose h1, .prose h2 { margin: 44px 0 16px; font: 600 26px/1.3 var(--body); letter-spacing: -.025em; } +.prose h3 { margin: 32px 0 12px; font-size: 21px; line-height: 1.3; font-weight: 600; letter-spacing: -.02em; } +.prose h4, .prose h5, .prose h6 { margin: 28px 0 10px; font-size: 17px; font-weight: 600; line-height: 1.4; } +.prose a { text-decoration: underline; text-decoration-color: var(--muted); } +.prose a:hover { text-decoration-color: var(--ink); } +.prose strong { font-weight: 600; } +.prose blockquote { margin: 28px 0; padding: 18px 24px; border: 1px solid var(--border); border-radius: 16px; background: var(--surface); color: var(--muted); } +.prose blockquote p { margin-block: 8px; } +.prose hr { margin: 40px 0; height: 1px; border: 0; background: var(--border); } +.prose figure { margin: 32px 0; } +.prose img { display: block; height: auto; border-radius: 14px; } +.prose figcaption { margin-top: 10px; font-size: 12px; line-height: 1.5; color: var(--muted); } +.prose audio { display: block; width: 100%; margin-block: 24px; } +.prose table { width: 100%; margin: 28px 0; border-collapse: collapse; font-size: 14px; line-height: 1.5; } +.prose > table { display: block; overflow-x: auto; } +.prose th { padding: 12px 16px; background: var(--soft); font-size: 12px; font-weight: 600; text-align: left; } +.prose td { padding: 12px 16px; border-bottom: 1px solid var(--border); vertical-align: top; } +.prose sup a { text-decoration: none; } +.scroll-x { overflow-x: auto; overscroll-behavior-x: contain; } +.footnotes { margin-top: 48px; padding-top: 20px; border-top: 1px solid var(--border); color: var(--muted); font-size: 14px; } +code { font-family: var(--font-mono); font-size: .85em; } +:not(pre) > code { padding: .15em .4em; border: 1px solid var(--border); border-radius: 6px; background: var(--surface); } +.prose > .highlight { margin: 28px 0; } +pre { max-width: 100%; margin: 28px 0; padding: 22px 24px; overflow-x: auto; border: 1px solid var(--border); border-radius: 16px; background: var(--surface); font-size: 13px; line-height: 1.7; } +pre code { font-size: inherit; } +.highlight pre { margin: 0; } +.chroma { background: var(--surface) !important; } + +/* ACRISS retains its decoder and a keyboard-scrollable reference table. */ +.code-input { display: block; width: 100%; max-width: 360px; margin-top: 10px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); color: var(--ink); font: 14px/1.5 var(--body); } +.code-input::placeholder { color: var(--muted); opacity: 1; } +.code-input:focus-visible { border-color: var(--ink); } +.prose .acriss-table { min-width: 680px; font-family: var(--font-mono); font-size: 13px; } +.prose .acriss-table td { border: 1px solid var(--border); padding: 10px 12px; } +.prose .acriss-table tr:nth-child(even) td { background: var(--surface); } +.prose .acriss-table td.highlight { background: var(--ink); color: var(--background); } + +@media (max-width: 900px) { + .projects { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .about-panel { grid-template-columns: 1fr; gap: 24px; } +} +@media (max-width: 760px) { + .hero { padding-block: 48px; } + .hero-lead { font-size: 17px; } + .archive-page { padding-top: 44px; } + .section-heading { align-items: flex-start; } + .section-heading h2 { font-size: 24px; } + .section-heading p { font-size: 13px; } + .section-heading .more { padding-top: 7px; font-size: 12px; gap: 6px; } + .doc-subtitle { font-size: 16px; } + .entry-link, .project-link { padding: 22px; } + .entry-title, .project-title { font-size: 18px; } + .entry-arrow { top: 22px; right: 22px; } + .about-panel { padding: 28px; } + .prose h1, .prose h2 { font-size: 24px; } + pre { padding: 18px; } +} +@media (max-width: 540px) { + .personal-site .site-header { align-items: flex-start; flex-direction: column; gap: 16px; padding-block: 20px 16px; } + .personal-site .site-nav { width: 100%; } + .site-nav ul { gap: 4px; } + .entries, .projects { grid-template-columns: 1fr; } + .section-heading { flex-wrap: wrap; gap: 10px; } + .section-heading .more { padding-top: 0; } + .about-panel { padding: 24px; } + .document-page .doc-title { font-size: 42px; } } diff --git a/assets/js/page-transitions.js b/assets/js/page-transitions.js new file mode 100644 index 0000000..a3989fe --- /dev/null +++ b/assets/js/page-transitions.js @@ -0,0 +1,58 @@ +// Pair only the selected card title with the next page's h1. Navigation remains +// browser-owned; without this enhancement the CSS-only page fade still works. +(function () { + if (!("onpageswap" in window) || !("onpagereveal" in window) || !window.navigation) return; + + const pendingKey = "riesinger:heading-transition"; + const reducedMotion = matchMedia("(prefers-reduced-motion: reduce)"); + + window.addEventListener("pageswap", function (event) { + if (!event.viewTransition || !event.activation || reducedMotion.matches) return; + + for (const title of document.querySelectorAll("[data-transition-title]")) { + if (title.closest("a").href !== event.activation.entry.url) continue; + + // Hand off just this navigation's identity, never coordinates or HTML. + // Storage may be unavailable; in that case retain the ordinary fade. + try { + sessionStorage.setItem(pendingKey, JSON.stringify({ + from: location.href, + to: event.activation.entry.url, + })); + } catch { + return; + } + + title.style.viewTransitionName = "page-title"; + event.viewTransition.finished.then(function () { + title.style.removeProperty("view-transition-name"); + }); + return; + } + }); + + window.addEventListener("pagereveal", function (event) { + let pending; + try { + const stored = sessionStorage.getItem(pendingKey); + sessionStorage.removeItem(pendingKey); + pending = stored ? JSON.parse(stored) : null; + } catch { + return; + } + + if (!event.viewTransition || reducedMotion.matches || + pending?.to !== location.href || + pending?.from !== window.navigation?.activation?.from?.url) return; + + const title = document.querySelector("main h1"); + if (!title) return; + + title.style.viewTransitionName = "page-title"; + document.documentElement.dataset.headingTransition = ""; + event.viewTransition.finished.then(function () { + title.style.removeProperty("view-transition-name"); + delete document.documentElement.dataset.headingTransition; + }); + }); +})(); diff --git a/content/acriss.md b/content/acriss.md index 166aabd..fee1a88 100644 --- a/content/acriss.md +++ b/content/acriss.md @@ -3,64 +3,14 @@ title: "ACRISS Car Codes" wide: true --- - This is a mirror of the data on https://acriss.org/car-codes/, since it's too slow of a site for my tastes. - + + -
- +
+
diff --git a/layouts/404.html b/layouts/404.html index 0ef9b76..25e65a8 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -1,10 +1,13 @@ {{- define "main" }} -
-

404

-

Nothing at this address

-

- The page either moved or never existed. -

+
+ {{ partial "icon" "back" }} Home +
+

404

+

Nothing at this address

+

+ The page either moved or never existed. +

+

Start from the writing index or the diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 4201f34..e577eb8 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -1,7 +1,7 @@ {{ partial "head" . }} - + {{ partial "header" . }} {{- block "main" . }}{{- end }} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 3aaade8..6be29eb 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -1,9 +1,12 @@ {{ define "main" }} -

-

{{ .Title }}

- {{ with .Params.subtitle }} -

{{ . }}

- {{ end }} +
+ {{ partial "icon" "back" }} Home +
+

{{ .Title }}

+ {{ with .Params.subtitle }} +

{{ . }}

+ {{ end }} +
{{ .Content }}
{{ end }} diff --git a/layouts/index.html b/layouts/index.html index 5d5fce7..138bb97 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,40 +1,40 @@ {{ define "main" }} {{ $posts := where site.RegularPages "Section" "posts" }} {{ $projects := (site.GetPage "/projects").Pages }} -
-
-
-

- {{ .Params.firstName | default "Pascal" }}{{ .Params.lastName | default "Riesinger" }} -

-
{{ .Content }}
+
+
+ Software engineer · Germany +

{{ .Params.firstName | default "Pascal" }} {{ .Params.lastName | default "Riesinger" }}

+
{{ .Content }}
+ - {{ partial "cadence" . }}
{{ with $posts }} -
-
-

Writing

- All {{ len . }} posts +
+
+

Recent writing

Notes from things I’ve built and figured out.

+ All {{ len . }} posts {{ partial "icon" "arrow" }}
- {{ partial "entries" (dict "pages" (first 5 .)) }} + {{ partial "entries" (dict "pages" (first 4 .)) }}
{{ end }} {{ with $projects }} -
-
-

Projects

- All {{ len . }} projects +
+
+

Things I’ve built

Side projects, experiments, and useful little tools.

+ All projects {{ partial "icon" "arrow" }}
{{ partial "projects" (dict "pages" (first 3 .)) }}
{{ end }} {{ with site.GetPage "/about" }} -
-

{{ .Title }}

+
+
Beyond the code

{{ .Title }}

{{ .Content }}
{{ end }} diff --git a/layouts/partials/cadence.html b/layouts/partials/cadence.html deleted file mode 100644 index b83ec7f..0000000 --- a/layouts/partials/cadence.html +++ /dev/null @@ -1,44 +0,0 @@ -{{- /* Posts per year, drawn from the archive itself. */ -}} -{{- $posts := where site.RegularPages "Section" "posts" }} -{{- $counts := dict }} -{{- $first := 9999 }} -{{- $last := 0 }} -{{- range $posts }} -{{- $year := .Date.Year }} -{{- $key := printf "%d" $year }} -{{- $counts = merge $counts (dict $key (add 1 (int (or (index $counts $key) 0)))) }} -{{- if lt $year $first }}{{ $first = $year }}{{ end }} -{{- if gt $year $last }}{{ $last = $year }}{{ end }} -{{- end }} - -{{- if gt $last $first }} -{{- $span := seq $first $last }} -{{- $max := 1 }} -{{- range $counts }}{{ if gt . $max }}{{ $max = . }}{{ end }}{{ end }} - -
-

Entries per year

- - -

- {{ len $posts }} posts between {{ $first }} and {{ $last }}, mostly about whatever I was building at the time. -

-
-{{- end }} diff --git a/layouts/partials/entries.html b/layouts/partials/entries.html index 443ce9a..d5c2e70 100644 --- a/layouts/partials/entries.html +++ b/layouts/partials/entries.html @@ -1,18 +1,22 @@ -{{- /* Dated index rows. Expects a dict: "pages" (page collection). */ -}} +{{- /* Dated entry cards. Expects a dict: "pages" (page collection). */ -}}
    {{- range .pages }} {{- $tags := .Params.tags | default slice }} {{- $slugs := slice }} {{- range $tags }}{{ $slugs = $slugs | append (. | urlize) }}{{ end }} -
  1. +
  2. - {{ .Title }} + {{ .Title }} + {{- with .Params.subtitle | default .Params.summary }} + {{ . | plainify }} + {{- end }} {{- with $tags }} {{- end }} +
  3. {{- end }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 2bc9148..81f987d 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,8 +1,7 @@ -
    + diff --git a/layouts/partials/head.html b/layouts/partials/head.html index c3bd8b0..6790eb2 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -2,8 +2,10 @@ + + {{ $title := site.Title }} @@ -28,6 +30,9 @@ {{- end }} + {{ $base := resources.Get "css/base.css" | minify | fingerprint }} + + {{/* Each syntax theme is scoped to its scheme: stacking them would leave light-only token colours behind on a dark background. */}} {{ $main := resources.Get "css/main.css" }} @@ -35,6 +40,9 @@ {{ $dark := printf "@media (prefers-color-scheme: dark) {\n%s\n}" (resources.Get "css/chroma-dark.css").Content | resources.FromString "css/chroma-dark-scoped.css" }} {{ $css := slice $main $light $dark | resources.Concat "css/bundle.css" | minify | fingerprint }} + {{/* Register pagereveal before the first rendering opportunity. */}} + {{ $transitions := resources.Get "js/page-transitions.js" | js.Build (dict "minify" true) | fingerprint }} + From 6e092d41ecf3a1213c6ac19336ec065f5dbc3a0b Mon Sep 17 00:00:00 2001 From: Pascal Riesinger Date: Wed, 4 Nov 2026 16:16:24 +0100 Subject: [PATCH 3/3] New Favicon --- README.md | 12 ++++++++---- layouts/partials/head.html | 12 ++++++------ layouts/partials/header.html | 4 ++-- public/android-chrome-192x192.png | 4 ++-- public/android-chrome-512x512.png | 4 ++-- public/apple-touch-icon.png | 4 ++-- public/favicon-16x16.png | 4 ++-- public/favicon-32x32.png | 4 ++-- public/favicon.ico | Bin 15086 -> 15086 bytes public/site.webmanifest | 4 ++-- static/android-chrome-192x192.png | 4 ++-- static/android-chrome-512x512.png | 4 ++-- static/apple-touch-icon.png | 4 ++-- static/favicon-16x16.png | 4 ++-- static/favicon-32x32.png | 4 ++-- static/favicon.ico | Bin 15086 -> 15086 bytes static/icon.svg | 10 +++++----- static/site.webmanifest | 4 ++-- 18 files changed, 45 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 00e6ebc..7c0dec4 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,14 @@ No Tailwind or frontend build dependencies are needed. - `assets/css/finance.css` adds finance-specific layouts without redefining the shared theme. - `layouts/partials/icon.html` contains the shared inline icons. -The custom P/R monogram lives in `static/icon.svg`; this is the font-independent -vector master used in the personal-site header and as the SVG favicon. Its colors -adapt to light/dark preferences. PNG and ICO exports use the fixed dark tile; -the Apple touch icon is opaque so the platform can apply its own mask. +The editorial R in `static/icon.svg` is outlined from the site's Instrument Serif +typeface, with slightly strengthened strokes for small sizes. This vector master +has no runtime font dependency and is used in the personal-site header and as the +SVG favicon. Its colors adapt to light/dark preferences. PNG and ICO exports use +the fixed dark tile; the Apple touch icon is opaque for the platform's own mask. + +Icon URLs carry the `v=2` revision to avoid stale browser caches. When replacing +the artwork, update that revision in the header, head links, and web manifest. Regenerate the raster exports with ImageMagick: diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 841dd5b..cee317b 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,12 +1,12 @@ - - - - - - + + + + + + {{ $title := site.Title }} {{ if and .Title (not .IsHome) }} diff --git a/layouts/partials/header.html b/layouts/partials/header.html index efe036d..72ac578 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -1,7 +1,7 @@ diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index b77725d..8794b31 100644 --- a/public/android-chrome-192x192.png +++ b/public/android-chrome-192x192.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f721200146e7847b948c173b8311b4fd796e4d5936a2eca9956952196620051 -size 3571 +oid sha256:90ac3dae8f2db46364a306ffe37ca91cfe320dde53a120e8741200622f86d9f4 +size 4253 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png index 7884308..712de72 100644 --- a/public/android-chrome-512x512.png +++ b/public/android-chrome-512x512.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92ab44b7d9e527a5b3aa59fdac1c4aa99f86afc47d44601fbc7704a6fffc22c9 -size 9508 +oid sha256:892eafddab140f25bd37beba153d021c092ae6d5363d1cd1709bfc06b6553fed +size 12043 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 647283d..c470882 100644 --- a/public/apple-touch-icon.png +++ b/public/apple-touch-icon.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b91df8cb643302d6af204a257e7ffb52cac18da812ee377e2870c50186ae3216 -size 1692 +oid sha256:9dea1f50350af76a525fb161ad71573075076e012cda4d9c1b5e0eb7cb19616d +size 2513 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 388f092..a55f611 100644 --- a/public/favicon-16x16.png +++ b/public/favicon-16x16.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:716394c5ffd2a488f9b56df4c19bb63f5db2a187790d954c190037bc452e231b -size 536 +oid sha256:a2560db199883c7127d1b75aa6c15ba794a982f3d835d537736fe9d1e9494704 +size 502 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index 5fc6908..5b20d12 100644 --- a/public/favicon-32x32.png +++ b/public/favicon-32x32.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b73001ec4b288c012b548c4423efcfeeb23c59379294a770a84b024c6aec4740 -size 857 +oid sha256:36fb4561a74e3998f6856ddd2213f88e8700c5301f869ebe7591fdadafe22ff8 +size 830 diff --git a/public/favicon.ico b/public/favicon.ico index 90f8d51e3083e1ea5f8def89f7bfb5a41bcb1c71..2a846fb8b30f492c292dbd0d9998642ad629c495 100644 GIT binary patch literal 15086 zcmeI3cWf2U5y#(8$=_glF<{esFwGz$dKZW;1VMxjrU(#4RDlsFL4ari2_b}OfBg81 zj)I8r4F&hOb$o;2PoyEot6ot>SX8Al?&M1B`Z zON&UE8u_(uB$6J9L{d}p?~@{thw>~*O5SJuJ`(whRA?Y|q)BA75YP3m&VLK%-%6D# zMQl`7uEz@<7y6fwN-(_<{@FqqLKTE8tn|ZvFW2pb!2Lxi(YT%bzY3<`gt`bhadSUN z=&6viU2(hrr(pb(ki8Fol=~+o0J|AW`e5cENv{7^g0P!DAWN)=KMUmvndc>?WIeE^ z4+X(qp+W^!u3R}^RIy@3*RkLm<;#~>RjO1`RjXE2<~|6H{JPmv{=;uO@U(5)R!y8Z zQB9gO$&<#68KW9CYNVWf0Bf5zZPbbtE7XAl2h@=xN7SZGn^d1ZeN^Sjm0kPmfe+pK z&EtL4_u#!`$rAPH(Q$@F%al%dGm$(fs-I^|!#BmX@aK*RLPd#?CkFYu50hMT;yv zd3kwi(4avYyOS6Fs8y?$I(zo4RsYtlTdHy6#+JO$2YY{=-w692{EHVaw(x*|@ZiBw z@@{y7twVC;{3%6z}5%OLoX{Z*@0nW0zj z-n~;jd-imltD?qjz8?fXd(@#rhb;WJZ{OCkA5VEVxJ~I7KN#7^Sg+=H`0!zsoSa;w zdeY#GRr~!naO}%;Z#=zII#Pe9+j>mJq_^CH#$`rjv(}AyFzp9ZVM<#UbGCqFs zBR|`>Z@0!iH#b+cY}wM%`|%iSHy(cQgPlFfF8kZIZ7YnO7P_pt;kWOVBNB1i!}%AW9jMX30n(p_+y=4m<#H2p8xXYi`9pP3l}ELh7O9Kwa~6z zJN5kea|=KI6ZQ(bti|g(D1PLpY15|K&tN)$UaDQYc0$%cVen%M-MxF)z}LPM{4t4G z$3gKUKdoA|vUCugIDPtbl#eK0vSZexU;hL3(Mtmc4A8ziGXXny?o5d67Y0A$zkdCC z16}K((W6HvRR6g7uiW%Mvevb0SM})8BMU$KaiZ2P>kU7lU4F1NhYT5_%9bsw*CTc4 z3)Hb=$0*+$_8n(p<|LjnZ+Kz5-~->kf4?=JTx{LCRW)nYO#67zHDJU?%DKh-utWRy z?HeX`;uyZhf$_q}ed*FA_2R_~11YNHymI5l4UPHz`}g`C{xFXo40Cm{a2v}Lf?hLmYE;&O?2TZp%fuY zUgY`@LMMfO3Wd$r?R%$%PjewKBn$l}j9dkL-u3F$iz1%kb2atAhuwqki5MvMqzkXd^yLL^P z^8ESp3Lh%{gf}=>uU@U5K7FdNZ?S9f3-iu{KQig{Ufca6MvSoXGsq_)-vOT@X92#? zc+Z+OOUJ^a-4uAlJ^vga`1=Z7bl z3X!+tiWMHackkBx&zw0E<(q&H=Q#3m_%Y_-_3Bg5cV7JA#o32^p|@|}svbRh=)MQ# z;Z@&@KmA{`W{vJU`A2TKRbJor^UjMu@osXp_#HfWut@xlvH0`6Ns}fzCIf$R#~2Sk zeF{=17Jue`=+L1G9|LjpqRPFn^Cy;L)?b}Ebu3>2`C3Kg^R@Hme9w8Ed@}rm#K4GS zhL__GeDO`E3q zfB5i0=QxI`2mJ6SkBs;ou~gzoVeUbG_|Kd@ZHGaT&_8%D__R0?*pRr5)tSvuv z=!>yGkbe_vNA8Rc#x7zHo;Pn^sPYf5)~#Es6DLmS{*e#M9?w2Y+-<>v1={8#PKsW% zuT4LFlRBRN(?MP``MmUx{61_9);jhl`#p9h`!Bgq?8O1s9p|hZFP!KW_OZTI zg6)7U+pAYEUwX{m{^-%8IzNfLch22@^uN75xhCLe&%AKqf|@*ea)B7^?HNB~YhZ_R zPUgLRyq(v)2d9}o=8O40dGe&%uwjEGkIr`Xdu(9xKRI`>M-X#8b?TIA-@bjU_EGXn zP9ruW`Rj}U|F^Vu&7{{b(T@}vL& literal 15086 zcmeI3S%_B2702&5lT04l-MF^YNNC4~DTK|=7kI7Z2RC*1xZ zNa`T(Mu%DQo)AQp@wvaF1MOgV6ZR3@5qxfLaplvO%y^*RRQ-gw8y)uwXXd3c!J{bt zO`0@OjT<*k0r63J{oh^X*l{t-WL{!!UFk31^}9=#E^6@L!D`T;K}qntYuB!6@o(0w znd;N0PfA&)T*~a+xwDF?1M9 zbm@|-7#;WG#S1lS)~vX7k4)C-4@O2%i0oCXRypOupS~NEmw3MS>eWjfIda5V29fXH zy;IAUEmQQbu(C4wmJNUUal3Zy)ZV>&1G)2I>(;HRb?esY)O~C{GvyEW=FOX{wQJX^ zj~_n<@;`9kfMR}#YR63Ko;=y`pEqxwdj0x!AosIp&#Hj~2gVvhh2)RU%r%c5JqqN0 z`}S=$X3Utpa?hmx=?BAy57+Z#5cy}%o~fBLXXdTX*lm?g|Dn%!?ATFNS68ch_wFg` z*pFMcZmFe9m*!=zv3Z;Kboi5}RjXF2Z{NOw=-s=wYSE%aUgjFZ*$%__Z`iOwHE7U4 z_XGM3AbrDz4eNk7^PSKxKi}_R{CDlzrAkXnlQxmDV@$|5>>cc+Hf`GII!Cuc>JY~N z)vH(P!Gi}*dj{KvF+hL6aN&YFeE6{1zJ0rzJ9nHZ8AXIiLK|g*9&S7{8`cfGG=g*&~ ztWW;+>i+%vs-~t!y?_56s)5gf1qc7MyodszR8vVZ6&oD*?2;;M6_2R6n0`SS}t ze;WDOhNn)QQayU~$a&wP{le-$Ti)cyMjbzXe5Uix`=~yaPyXl6pH~wnPRyp>pTyxG zbbgpg{bNU5y?RxxU%x)v`5vF*u{it}FJ2tDANSik_V1fFZ|ZXh&Up?VJg8Xjrca-) zZ4TDrEbTS?qTfdG=R0Q#VKz?CH*6!uCHb*!;A`xSIC3M>;M*+~JcvlA`=@JNiW5gY zgD4qke&^i0LhzMfbDDW`%_Woab_-|YhwLfuH-17o;Gf3Fj_=Xn8+peckV#z>GEYJ{ z;$t_wP57n6%@_Qbbw~(5eC+s4HE*8}9vx_h8-haCX&hPjr}44Z;qJHtfnJOU#&qPo zBx&Nv&L$1M-6{b-cDQM9=fwY*Z?z%wQmKITfi;eGI?~pVG}&+^Fa9{@M*O1qcFP3G zI+yo4v~Te1YtO4B{NjHhKmY&at_CV8O6vE!+VBRU)I0aIiUk#delz*~cR^6T zT*n`H!)-??)qxs8GYGW_!S&Ak@RIQ$R$66z$xMs|*GBcJ__dC8&YVd}@2|I@-*M%WAAc!#H0%ez(&*8nGd?qkBOl%IGyBh+@ITL( zF(aj&f^>DoN6F_q=U+#U9#x!;ntdsHv!BiOu1b)6&S2Ria&FPKZCmYsWFLti66DJN z>ynQzXWY1P`dom1IAFj4{mwXHA6r~ptn1vIg}drCZk$U#=jw1U9Xg~cDk?JO;L<-#rt2GXXV82Z)ebKC)IW7@`nn03 zBWag6Z{DQPShsFn*xZ*gj~iYt`N$YMc5I4I2_4JI%JiL@ef##+;Xoa9=+Gf;4leoV zZpI(q{it8RzP=yGnX-APBgO}5jc#$mbmcQ2AfJ1HwtVIz=7n6y_m6+(0KghgU!O8% zithJDcS7z==BoaK#y{)w)2B~U)*$3_HX5?_2DXW-{wXh==fsHi;Q!{Xn>_Tt{fq)C(X+7z?TvB%l%m(Oo( zMmR8j!oZq`Z_M1mVJxK4=Ipb6BVb=$rw#ax4sn3IG-Mh%?6cVGah|Xac?AZ0J@%XI z!GDku~O_Im6$?L8nIs0U|TNPI51)krz)_1JIPvduefL4Tl6GA>faro^SogZ%}2 z9QIl4^#adq{AUA&_{}*5#}dVYubKZ5-qcZr;5)%vK~z1E=CEM6fV|~`9|U@= zFs}S#hTmqqS>LWm9?JM9c|oU6owWT)XyQnZP0SjNZR%Th;E^CL^TU!QOZ5K?;BPnc z1$Vi3?%b*OkH?N3(>4WMYRgaROM2sT!@l7+du8rY^RORb|6%brW$2Lf=Fa?@HEUE+ zQIYl&;^Sw%UbJXYo%FTxlW}%_?v}H@j~qEt+eZ9<0`sQDJDJavW9P^BjgQsb1;kgp za^=dzC}_kRE&;wobR diff --git a/public/site.webmanifest b/public/site.webmanifest index d1a53e3..ef1621a 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -3,13 +3,13 @@ "short_name": "riesinger.dev", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "/android-chrome-192x192.png?v=2", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/android-chrome-512x512.png", + "src": "/android-chrome-512x512.png?v=2", "sizes": "512x512", "type": "image/png", "purpose": "any" diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png index b77725d..8794b31 100644 --- a/static/android-chrome-192x192.png +++ b/static/android-chrome-192x192.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f721200146e7847b948c173b8311b4fd796e4d5936a2eca9956952196620051 -size 3571 +oid sha256:90ac3dae8f2db46364a306ffe37ca91cfe320dde53a120e8741200622f86d9f4 +size 4253 diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png index 7884308..712de72 100644 --- a/static/android-chrome-512x512.png +++ b/static/android-chrome-512x512.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92ab44b7d9e527a5b3aa59fdac1c4aa99f86afc47d44601fbc7704a6fffc22c9 -size 9508 +oid sha256:892eafddab140f25bd37beba153d021c092ae6d5363d1cd1709bfc06b6553fed +size 12043 diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png index 647283d..c470882 100644 --- a/static/apple-touch-icon.png +++ b/static/apple-touch-icon.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b91df8cb643302d6af204a257e7ffb52cac18da812ee377e2870c50186ae3216 -size 1692 +oid sha256:9dea1f50350af76a525fb161ad71573075076e012cda4d9c1b5e0eb7cb19616d +size 2513 diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png index 388f092..a55f611 100644 --- a/static/favicon-16x16.png +++ b/static/favicon-16x16.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:716394c5ffd2a488f9b56df4c19bb63f5db2a187790d954c190037bc452e231b -size 536 +oid sha256:a2560db199883c7127d1b75aa6c15ba794a982f3d835d537736fe9d1e9494704 +size 502 diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png index 5fc6908..5b20d12 100644 --- a/static/favicon-32x32.png +++ b/static/favicon-32x32.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b73001ec4b288c012b548c4423efcfeeb23c59379294a770a84b024c6aec4740 -size 857 +oid sha256:36fb4561a74e3998f6856ddd2213f88e8700c5301f869ebe7591fdadafe22ff8 +size 830 diff --git a/static/favicon.ico b/static/favicon.ico index 90f8d51e3083e1ea5f8def89f7bfb5a41bcb1c71..2a846fb8b30f492c292dbd0d9998642ad629c495 100644 GIT binary patch literal 15086 zcmeI3cWf2U5y#(8$=_glF<{esFwGz$dKZW;1VMxjrU(#4RDlsFL4ari2_b}OfBg81 zj)I8r4F&hOb$o;2PoyEot6ot>SX8Al?&M1B`Z zON&UE8u_(uB$6J9L{d}p?~@{thw>~*O5SJuJ`(whRA?Y|q)BA75YP3m&VLK%-%6D# zMQl`7uEz@<7y6fwN-(_<{@FqqLKTE8tn|ZvFW2pb!2Lxi(YT%bzY3<`gt`bhadSUN z=&6viU2(hrr(pb(ki8Fol=~+o0J|AW`e5cENv{7^g0P!DAWN)=KMUmvndc>?WIeE^ z4+X(qp+W^!u3R}^RIy@3*RkLm<;#~>RjO1`RjXE2<~|6H{JPmv{=;uO@U(5)R!y8Z zQB9gO$&<#68KW9CYNVWf0Bf5zZPbbtE7XAl2h@=xN7SZGn^d1ZeN^Sjm0kPmfe+pK z&EtL4_u#!`$rAPH(Q$@F%al%dGm$(fs-I^|!#BmX@aK*RLPd#?CkFYu50hMT;yv zd3kwi(4avYyOS6Fs8y?$I(zo4RsYtlTdHy6#+JO$2YY{=-w692{EHVaw(x*|@ZiBw z@@{y7twVC;{3%6z}5%OLoX{Z*@0nW0zj z-n~;jd-imltD?qjz8?fXd(@#rhb;WJZ{OCkA5VEVxJ~I7KN#7^Sg+=H`0!zsoSa;w zdeY#GRr~!naO}%;Z#=zII#Pe9+j>mJq_^CH#$`rjv(}AyFzp9ZVM<#UbGCqFs zBR|`>Z@0!iH#b+cY}wM%`|%iSHy(cQgPlFfF8kZIZ7YnO7P_pt;kWOVBNB1i!}%AW9jMX30n(p_+y=4m<#H2p8xXYi`9pP3l}ELh7O9Kwa~6z zJN5kea|=KI6ZQ(bti|g(D1PLpY15|K&tN)$UaDQYc0$%cVen%M-MxF)z}LPM{4t4G z$3gKUKdoA|vUCugIDPtbl#eK0vSZexU;hL3(Mtmc4A8ziGXXny?o5d67Y0A$zkdCC z16}K((W6HvRR6g7uiW%Mvevb0SM})8BMU$KaiZ2P>kU7lU4F1NhYT5_%9bsw*CTc4 z3)Hb=$0*+$_8n(p<|LjnZ+Kz5-~->kf4?=JTx{LCRW)nYO#67zHDJU?%DKh-utWRy z?HeX`;uyZhf$_q}ed*FA_2R_~11YNHymI5l4UPHz`}g`C{xFXo40Cm{a2v}Lf?hLmYE;&O?2TZp%fuY zUgY`@LMMfO3Wd$r?R%$%PjewKBn$l}j9dkL-u3F$iz1%kb2atAhuwqki5MvMqzkXd^yLL^P z^8ESp3Lh%{gf}=>uU@U5K7FdNZ?S9f3-iu{KQig{Ufca6MvSoXGsq_)-vOT@X92#? zc+Z+OOUJ^a-4uAlJ^vga`1=Z7bl z3X!+tiWMHackkBx&zw0E<(q&H=Q#3m_%Y_-_3Bg5cV7JA#o32^p|@|}svbRh=)MQ# z;Z@&@KmA{`W{vJU`A2TKRbJor^UjMu@osXp_#HfWut@xlvH0`6Ns}fzCIf$R#~2Sk zeF{=17Jue`=+L1G9|LjpqRPFn^Cy;L)?b}Ebu3>2`C3Kg^R@Hme9w8Ed@}rm#K4GS zhL__GeDO`E3q zfB5i0=QxI`2mJ6SkBs;ou~gzoVeUbG_|Kd@ZHGaT&_8%D__R0?*pRr5)tSvuv z=!>yGkbe_vNA8Rc#x7zHo;Pn^sPYf5)~#Es6DLmS{*e#M9?w2Y+-<>v1={8#PKsW% zuT4LFlRBRN(?MP``MmUx{61_9);jhl`#p9h`!Bgq?8O1s9p|hZFP!KW_OZTI zg6)7U+pAYEUwX{m{^-%8IzNfLch22@^uN75xhCLe&%AKqf|@*ea)B7^?HNB~YhZ_R zPUgLRyq(v)2d9}o=8O40dGe&%uwjEGkIr`Xdu(9xKRI`>M-X#8b?TIA-@bjU_EGXn zP9ruW`Rj}U|F^Vu&7{{b(T@}vL& literal 15086 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 diff --git a/static/icon.svg b/static/icon.svg index 327a416..bfb28d3 100644 --- a/static/icon.svg +++ b/static/icon.svg @@ -2,13 +2,13 @@ Pascal Riesinger - - - + + + diff --git a/static/site.webmanifest b/static/site.webmanifest index d1a53e3..ef1621a 100644 --- a/static/site.webmanifest +++ b/static/site.webmanifest @@ -3,13 +3,13 @@ "short_name": "riesinger.dev", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "/android-chrome-192x192.png?v=2", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/android-chrome-512x512.png", + "src": "/android-chrome-512x512.png?v=2", "sizes": "512x512", "type": "image/png", "purpose": "any"
CATEGORY