90 lines (90 loc) · 4.83 KB
 1<meta charset="utf-8">
 2<meta name="viewport" content="width=device-width, initial-scale=1">
 3<meta name="color-scheme" content="dark light">
 4<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f8f4e9">
 5<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0d0b09">
 6<link rel="icon" type="image/svg+xml" href="/favicon.svg">
 7<link rel="icon" href="/favicon.ico" sizes="32x32">
 8<link rel="apple-touch-icon" href="/apple-touch-icon.png">
 9<link rel="manifest" href="/site.webmanifest">
10<link rel="canonical" href="{{ .Permalink }}">
11{{- if .IsTranslated }}
12{{- range .AllTranslations }}
13<link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}">
14{{- end }}
15{{- range .AllTranslations }}{{- if eq .Language.Lang "en" }}
16<link rel="alternate" hreflang="x-default" href="{{ .Permalink }}">
17{{- end }}{{- end }}
18{{- end }}
19{{ range .AlternativeOutputFormats -}}
20<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink }}" title="{{ site.Title }}">
21{{ end -}}
22<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}</title>
23{{- $desc := "" -}}
24{{- with .Description }}{{ $desc = . }}{{ end -}}
25{{- if not $desc }}{{ with .Params.description }}{{ $desc = . }}{{ end }}{{ end -}}
26{{- if not $desc }}{{ with site.Params.description }}{{ $desc = . }}{{ end }}{{ end -}}
27{{- if not $desc }}{{ $desc = site.Title }}{{ end -}}
28{{- $desc = $desc | plainify | truncate 160 -}}
29{{- /* card desc: home → site tagline; other pages → their OWN description, no site fallback. */ -}}
30{{- $ownDesc := "" -}}
31{{- with .Description }}{{ $ownDesc = . }}{{ end -}}
32{{- if not $ownDesc }}{{ with .Params.description }}{{ $ownDesc = . }}{{ end }}{{ end -}}
33{{- $cardDesc := cond .IsHome $desc ($ownDesc | plainify | truncate 160) -}}
34{{- $ogTitle := cond .IsHome (printf "%s — Engineering, writing, and collaborations" site.Title) (printf "%s | %s" .Title site.Title) -}}
35{{- /* og:image — dynamic card per page (title/type/date); real image only when a page sets `cover`. */ -}}
36{{- $ogImageURL := "" -}}
37{{- $hasCustom := false -}}
38{{- if .IsPage -}}
39  {{- with .Params.cover -}}
40    {{- if hasPrefix . "http" -}}
41      {{- $ogImageURL = . -}}
42      {{- $hasCustom = true -}}
43    {{- else -}}
44      {{- $path := printf "images/posts/%s" . -}}
45      {{- with resources.Get $path -}}
46        {{- $raw := .Permalink | absURL -}}
47        {{- $ogImageURL = cond site.Params.r2Transforms (printf "%s/cdn-cgi/image/width=1200,height=630,fit=cover,format=webp,quality=80/%s" site.Params.r2BaseURL $.Params.cover) $raw -}}
48        {{- $hasCustom = true -}}
49      {{- end -}}
50    {{- end -}}
51  {{- end -}}
52{{- end -}}
53{{- if not $hasCustom -}}
54  {{- $imgTitle := cond .IsHome site.Title .Title -}}
55  {{- $q := slice (printf "title=%s" ($imgTitle | urlquery)) -}}
56  {{- if eq .Kind "section" }}{{- $q = $q | append "section=1" -}}{{- end -}}
57  {{- with .Section }}{{- $q = $q | append (printf "type=%s" (. | urlquery)) -}}{{- end -}}
58  {{- if .IsPage }}{{- with .Date }}{{- if not .IsZero }}{{- $q = $q | append (printf "date=%s" (.Format "Jan 2006" | urlquery)) -}}{{- end -}}{{- end -}}{{- end -}}
59  {{- with $cardDesc }}{{- $q = $q | append (printf "desc=%s" (. | urlquery)) -}}{{- end -}}
60  {{- $ogImageURL = printf "%sog-image?%s" site.BaseURL (delimit $q "&") -}}
61{{- end -}}
62<meta name="description" content="{{ $desc }}">
63<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
64<meta property="og:title" content="{{ $ogTitle }}">
65<meta property="og:description" content="{{ $desc }}">
66<meta property="og:url" content="{{ .Permalink }}">
67{{ printf `<meta property="og:image" content="%s">` $ogImageURL | safeHTML }}
68<meta name="twitter:card" content="summary_large_image">
69{{- if .IsHome }}
70{{- $sameAs := slice }}
71{{- range site.Params.media }}{{ $sameAs = $sameAs | append .url }}{{ end }}
72<script type="application/ld+json">{{ (dict "@context" "https://schema.org" "@type" "Person" "name" site.Title "url" site.BaseURL "sameAs" $sameAs) | jsonify }}</script>
73{{- end }}
74<script>
75  document.documentElement.classList.add('js');
76  (function () {
77    try {
78      var storedTheme = localStorage.getItem('preferred-theme');
79      var theme = storedTheme || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
80      document.documentElement.dataset.theme = theme;
81      document.documentElement.style.background = theme === 'dark' ? '#0d0b09' : '#f8f4e9';
82      document.documentElement.style.color = theme === 'dark' ? '#ddd9d4' : '#2b2621';
83      document.documentElement.style.colorScheme = theme;
84    } catch (_) {}
85  })();
86</script>
87<link rel="preload" href="/fonts/Silkscreen-Regular.woff2" as="font" type="font/woff2" crossorigin>
88{{ partialCached "head/scss.html" . }}
89{{ partialCached "head/js.html" . }}
90{{ if and .IsPage (eq .Section "photos") }}{{ partial "head/gallery.html" . }}{{ end }}