Commit Graph

42 Commits

Author SHA1 Message Date
valknar a24d2611c2 fix: new post 2026-04-19 16:04:43 +02:00
valknar 1c35b43655 feat: new post 2026-04-19 16:02:51 +02:00
valknar 4419d72a1d content: rewrite valknar author bio to reflect actual body of work
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 15:57:49 +02:00
valknar ef9627b539 feat: new post 2026-04-18 15:54:23 +02:00
valknar 811bb49517 fix: homepage posts size = 8 2026-04-18 11:44:48 +02:00
valknar 08273d44ba feat: new post 2026-04-17 16:57:12 +02:00
valknar b90f9fae3c fix: remove hugo git info 2026-04-16 13:46:12 +02:00
valknar f0641c0425 fix: docker no .git 2026-04-16 13:42:56 +02:00
valknar e8190f197f fix: docker copy .git 2026-04-16 13:30:01 +02:00
valknar 5f4e03164d fix: git for docker build 2026-04-16 13:15:00 +02:00
valknar be3c012e96 fix: hugo.toml 2026-04-16 13:10:37 +02:00
valknar eb81d29bd9 feat: new post 2026-04-16 11:13:16 +02:00
valknar e9362644cf feat: new post 2026-04-16 10:33:22 +02:00
valknar 189a19f875 feat: new post 2026-04-14 17:30:34 +02:00
valknar 5b04da2a11 feat: new post 2026-04-14 16:26:30 +02:00
valknar 16352b9152 feat: limit homepage latest posts to 4, fix total post count in CTA
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 16:26:10 +02:00
valknar 10239ffe83 feat: center banner image with fixed-height cover strip
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 15:17:20 +02:00
valknar cfdd49c2a2 feat: new post 2026-04-14 11:45:13 +02:00
valknar edae473c16 feat: new post 2026-04-13 16:41:16 +02:00
valknar 08320ff840 feat: new post 2026-04-13 10:53:48 +02:00
valknar a5e4a889b9 chore: cleanup 2026-04-12 11:44:51 +02:00
valknar df0fd30618 feat: new post 2026-04-12 09:10:13 +02:00
valknar 177aec5718 fix: nav current text-gradient-alt class 2026-04-11 19:46:05 +02:00
valknar 2b3cf8bada fix: redirect ffmpeg stdin from /dev/null in compress-videos.sh
FFmpeg inside a find|while pipe was consuming the remaining filenames
from stdin as interactive commands, causing parse errors. Adding
< /dev/null isolates ffmpeg from the pipe so find can feed all paths
to the while loop uninterrupted.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 18:45:10 +02:00
valknar 1f24ee8276 feat: compress MP4 videos at Docker build time via FFmpeg
Hugo has no video processing, so FFmpeg runs in the builder stage
before hugo builds, compressing every content/**/*.mp4 in-place.

scripts/compress-videos.sh:
  - H.264 CRF 28 + preset slow (good web compression)
  - faststart for progressive streaming
  - AAC 64k audio
  - Only replaces source if output is actually smaller, so
    already-lean videos are skipped

Dockerfile:
  - apk adds ffmpeg alongside hugo in the builder stage
  - RUN compress-videos.sh runs after COPY . . before pnpm build
    (compressed files land in public/ via Hugo's copy of page bundles)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 18:42:57 +02:00
valknar 3ac7e9c549 fix: lightbox chrome z-index and layout alignment
Root cause: media container was position:absolute inset-0 but without
z-index, while buttons had no z-index either — in fill mode the image
painted over the buttons making close/fill-toggle unclickable.

Fixes:
- Media div is now absolute inset-0 (explicit), chrome bars are z-10
- Top bar is a single flex row (h-14): left spacer | counter | FILL+✕
  so counter, fill toggle and close are vertically aligned at the same
  height instead of scattered absolute elements
- Bottom bar is a flex row (h-14) centred over dots
- Both bars have a linear-gradient scrim so chrome stays legible over
  fill-mode images without a solid background
- Prev/Next arrows get z-10 so they always sit above the media
- Media padding uses pt-14 pb-14 in fit mode to clear the chrome bars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 18:37:33 +02:00
valknar 08ddfd54d7 feat: lightbox fill/fit toggle mode
Add fill state (default false) to the Alpine lightbox data:
- FILL button (top-right, left of ✕): switches media to object-cover,
  filling the entire overlay edge-to-edge; button turns heat pink
- FIT restores object-contain with padding; button returns to fog
- Keyboard shortcut F toggles fill while lightbox is open
- close() resets fill to false for the next open
- transition-all duration-300 on container padding and media for
  a smooth morph between modes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 18:33:45 +02:00
valknar 1998820dec feat: gallery lightbox with Alpine.js
Hugo pre-computes a JSON array of {img, video} entries per gallery item
(WebP 1200w src + optional mp4 src). Alpine reads the array and manages
lightbox state (open/idx/prev/next/close).

Features:
- Click any card → opens fullscreen dark overlay (bg-void/95 + backdrop-blur)
- Videos: controls, autoplay, x-effect reloads src on navigate
- Images: full-res WebP centred with object-contain
- Keyboard: Escape closes, ←/→ navigate
- Dot indicators: active dot expands (heat colour)
- Prev/next arrow buttons (hidden when only 1 item)
- Grid cards: cursor-zoom-in, pointer-events-none on media so click
  always hits the <figure>
- Teleported to <body> via x-teleport to avoid stacking context issues
- Gradient-line accent top and bottom of overlay

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 18:24:33 +02:00
valknar 72d24f5f4d fix: related posts bg 2026-04-11 18:20:01 +02:00
valknar d851ca572d feat: new post 2026-04-11 18:15:42 +02:00
valknar 26a306f3a6 fix: logo text color 2026-04-11 17:51:21 +02:00
valknar 7d29f8373f fix: author-card max-w-2xl 2026-04-11 17:36:20 +02:00
valknar d1ce2e7eb3 docs: add comprehensive README
Covers stack, getting started, project structure, content model
(posts + authors), image processing pipeline, design system
(tokens, typography, components), templates, HTMX/Alpine
interactivity, SEO, Docker/nginx/Traefik deployment, and
content authoring workflow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 11:06:55 +02:00
valknar 84624fec33 fix: add X-Robots-Tag: index, follow to nginx to allow crawling
Lighthouse reported is-crawlable FAIL because the server was sending
X-Robots-Tag: none,noarchive,... (likely injected by Traefik/Coolify
security-headers middleware). Explicitly declare the correct value here;
override via Traefik label also documented below.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 19:14:00 +02:00
valknar 36767c3d4d perf: Hugo image processing — auto-convert all images to WebP with srcset
Add layouts/partials/img.html helper that resizes and converts any Hugo
page-resource image to WebP, emitting a responsive srcset at multiple
widths. Wire it up to every image rendering site:

- post-card.html: thumbnail (600w/1000w) + avatar (64px WebP)
- post-card-large.html: featured card background (800w/1200w)
- posts/single.html: banner (1200w/1800w, eager) + gallery (800w/1200w)
- author-card.html: avatar (96px WebP, 2× retina)

Result: banner.png 7.9 MB → 496 KB WebP at 1800w (−94 %).
Hugo caches processed images in resources/_gen/ across builds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 19:12:06 +02:00
valknar 9af45979f1 fix: address Lighthouse SEO and performance audit failures
- nav: fix label-content-name-mismatch — aria-label now uses logoText
  ("PIVOINE") to match the visible link text (WCAG 2.5.3)
- index: improve link-text — "Learn more" → "About the magazine"
  so the /about/ CTA has a descriptive accessible name
- head: load Google Fonts async via media=print/onload pattern to
  eliminate render-blocking resource penalty (~480ms est. savings)

Remaining items needing server-side action:
- is-crawlable: x-robots-tag: none,... header must be removed in the
  web server / CDN config (not controllable from this repo)
- image-delivery: large banner PNGs on live site need manual WebP
  conversion or migration to Hugo page bundles for auto-processing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 19:07:10 +02:00
valknar 3b8e1f7a1f feat: add PWA and favicon assets
apple-touch-icon, android-chrome icons (192/512), PNG favicons
(16/32), ICO fallback, and site.webmanifest with heat theme color.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 18:48:41 +02:00
valknar e57a15f733 polish: CSS-only hover transitions for nav and footer links
Adds translateY lift and smoother easing on hover for desktop nav,
footer nav, and social links. Active underline gets expo easing.
No markup changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 18:45:57 +02:00
valknar 00ee9e15ed Revert "polish: smooth hover transitions on nav and footer links"
This reverts commit d967dd261a.
2026-04-10 18:44:15 +02:00
valknar d967dd261a polish: smooth hover transitions on nav and footer links
- Desktop nav: underline uses scaleX transform (origin-left) instead of
  width, now shows on hover for inactive links too
- Mobile nav: link text slides translateX on hover for directional feel
- Footer nav: matching scaleX underline on hover
- Footer social: external arrow icon nudges diagonally on hover

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 18:38:14 +02:00
valknar 245a8e614d feat: add full favicon & PWA meta tags to head
Adds apple-touch-icon, PNG favicons, webmanifest link, and
msapplication-TileColor; existing SVG/ICO fallbacks retained.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 17:46:36 +02:00
valknar cd1ff989d0 Initial commit 2026-04-08 19:49:15 +02:00