furtka/website/layouts/partials/head.html

20 lines
1.5 KiB
HTML
Raw Permalink Normal View History

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
feat(site): pimp homepage with animated 3D background and scroll reveals Adopts the visual feel of Pascal's prototype while keeping Furtka's voice, brand palette, and bilingual structure intact. What changed - Three.js wireframe torus-knot behind the hero, color/opacity tied to the existing --accent / --scene-opacity CSS vars so light and dark modes both work without a scene re-init. - Scroll-driven camera zoom + core scale + tilt; canvas opacity fades past hero so feature cards stay readable. - GSAP + ScrollTrigger reveal hero on load and stagger feature cards in as they enter the viewport. Lenis smooths scroll. - "What works today" / "What's coming next" lists move from markdown bullets into front-matter arrays and render as scroll-reveal cards (7 + 4 cards, EN/DE parallel; copy is 1:1 from the original lists). - Hero scaled up: gradient text on the wordmark (fg → accent), drop-shadow glow in dark mode, brighter lede color. - Primary CTA -> /releases listing on Forgejo (Forgejo has no /releases/latest), with a pulsing glow + arrow slide on hover. - Version bump 26.8-alpha -> 26.15-alpha to match the actual release. Performance / a11y - Vendor JS (Three.js r128, GSAP 3.12.2 + ScrollTrigger, Lenis 1.0.33) vendored locally under assets/js/vendor/ - no third-party CDN at runtime. ~728 KB total, fingerprinted via Hugo's pipeline with SRI. - Canvas + scripts gated to homepage only ({{ if .IsHome }}); the Impressum/Datenschutz pages stay plain. - prefers-reduced-motion: scene + GSAP early-return, CSS forces cards to their resting state. No-JS users see all content. - All scripts deferred so first paint isn't blocked. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:14:21 +02:00
<script>document.documentElement.classList.replace('no-js','js');</script>
<title>{{ if .IsHome }}{{ site.Title }} — {{ site.Params.description }}{{ else }}{{ .Title }} · {{ site.Title }}{{ end }}</title>
<meta name="description" content="{{ with .Params.description }}{{ . }}{{ else }}{{ site.Params.description }}{{ end }}">
feat(site): pimp homepage with animated 3D background and scroll reveals Adopts the visual feel of Pascal's prototype while keeping Furtka's voice, brand palette, and bilingual structure intact. What changed - Three.js wireframe torus-knot behind the hero, color/opacity tied to the existing --accent / --scene-opacity CSS vars so light and dark modes both work without a scene re-init. - Scroll-driven camera zoom + core scale + tilt; canvas opacity fades past hero so feature cards stay readable. - GSAP + ScrollTrigger reveal hero on load and stagger feature cards in as they enter the viewport. Lenis smooths scroll. - "What works today" / "What's coming next" lists move from markdown bullets into front-matter arrays and render as scroll-reveal cards (7 + 4 cards, EN/DE parallel; copy is 1:1 from the original lists). - Hero scaled up: gradient text on the wordmark (fg → accent), drop-shadow glow in dark mode, brighter lede color. - Primary CTA -> /releases listing on Forgejo (Forgejo has no /releases/latest), with a pulsing glow + arrow slide on hover. - Version bump 26.8-alpha -> 26.15-alpha to match the actual release. Performance / a11y - Vendor JS (Three.js r128, GSAP 3.12.2 + ScrollTrigger, Lenis 1.0.33) vendored locally under assets/js/vendor/ - no third-party CDN at runtime. ~728 KB total, fingerprinted via Hugo's pipeline with SRI. - Canvas + scripts gated to homepage only ({{ if .IsHome }}); the Impressum/Datenschutz pages stay plain. - prefers-reduced-motion: scene + GSAP early-return, CSS forces cards to their resting state. No-JS users see all content. - All scripts deferred so first paint isn't blocked. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:14:21 +02:00
<meta name="theme-color" content="#f7f6f3" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#0d0d0f" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<meta property="og:site_name" content="{{ site.Title }}">
<meta property="og:title" content="{{ if .IsHome }}{{ site.Title }}{{ else }}{{ .Title }} · {{ site.Title }}{{ end }}">
<meta property="og:description" content="{{ with .Params.description }}{{ . }}{{ else }}{{ site.Params.description }}{{ end }}">
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
<meta property="og:url" content="{{ .Permalink }}">
{{ $parts := split .Site.Language.LanguageCode "-" }}<meta property="og:locale" content="{{ index $parts 0 }}{{ if gt (len $parts) 1 }}_{{ upper (index $parts 1) }}{{ end }}">
{{ range .AllTranslations }}
<link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">
{{ end }}
{{ $css := resources.Get "css/main.css" | minify | fingerprint }}
<link rel="stylesheet" href="{{ $css.RelPermalink }}" integrity="{{ $css.Data.Integrity }}">