themes/hugo-coder/layouts/_default/baseof.html

042ab92fbfa06083534de08fa33e1daf98a8caec · 9.1 KB · 238 lines raw

1 <!DOCTYPE html>
2 <html lang="{{ .Site.Language.Lang }}">
3
4 <head>
5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <meta http-equiv="Content-Language" content="{{ .Site.Language.Lang }}">
8 <meta name="color-scheme" content="light dark">
9
10 {{ if .Site.Params.csp }}
11 {{ partial "csp.html" . }}
12 {{ end }}
13
14 <style>
15 @keyframes snow {
16 0% {
17 transform: translate(var(--x), var(--y));
18 }
19 50% {
20 transform: translate(calc(var(--x) - var(--w)), calc(100vh - 5px));
21 }
22 100% {
23 transform: translate(calc(var(--x) - var(--w)), calc(100vh - 5px)) scale(0);
24 }
25 }
26
27 .snow {
28 width: 5px;
29 height: 5px;
30 border-radius: 50%;
31 background-color: white;
32 position: absolute;
33 transform: translate(var(--x), var(--y));
34 animation: snow var(--s) linear var(--d) infinite;
35 }
36
37 body {
38 overflow: hidden;
39 }
40
41 </style>
42
43 {{ with .Site.Params.author }}<meta name="author" content="{{ . }}">{{ end }}
44 <meta name="description" content="{{ .Description | default (.Summary | default .Site.Params.description ) }}">
45 <meta name="keywords" content="{{ (delimit .Keywords ",") | default .Site.Params.keywords }}">
46
47 {{ template "_internal/twitter_cards.html" . }}
48 {{ template "_internal/opengraph.html" . }}
49
50 <title>{{ block "title" . }}{{ .Site.Title }}{{ end }}</title>
51
52 {{ if .Permalink }}
53 <link rel="canonical" href="{{ .Permalink }}">
54 {{ end }}
55
56 <link rel="preload" href="/fonts/forkawesome-webfont.woff2?v=1.2.0" as="font" type="font/woff2" crossorigin>
57
58 {{ if .Site.IsServer }}
59 {{ $cssOpts := (dict "targetPath" "css/coder.css" "enableSourceMap" true ) }}
60 {{ $styles := resources.Get "scss/coder.scss" | resources.ExecuteAsTemplate "style.coder.css" . | toCSS $cssOpts }}
61 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" media="screen">
62 {{ else }}
63 {{ $cssOpts := (dict "targetPath" "css/coder.css" ) }}
64 {{ $styles := resources.Get "scss/coder.scss" | resources.ExecuteAsTemplate "style.coder.css" . | toCSS $cssOpts | minify | fingerprint }}
65 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Integrity }}" crossorigin="anonymous" media="screen" />
66 {{ end }}
67
68 {{ if .Site.Params.rtl }}
69 {{ if .Site.IsServer }}
70 {{ $cssOpts := (dict "targetPath" "css/coder-rtl.css" "enableSourceMap" true ) }}
71 {{ $styles := resources.Get "scss/coder-rtl.scss" | resources.ExecuteAsTemplate "style.coder-rtl.css" . | toCSS $cssOpts }}
72 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" media="screen">
73 {{ else }}
74 {{ $cssOpts := (dict "targetPath" "css/coder-rtl.css" ) }}
75 {{ $styles := resources.Get "scss/coder-rtl.scss" | resources.ExecuteAsTemplate "style.coder-rtl.css" . | toCSS $cssOpts | minify | fingerprint }}
76 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Integrity }}" crossorigin="anonymous" media="screen" />
77 {{ end }}
78 {{ end }}
79
80 {{ if or (eq .Site.Params.colorScheme "auto") (eq .Site.Params.colorScheme "dark") }}
81 {{ if .Site.IsServer }}
82 {{ $cssOpts := (dict "targetPath" "css/coder-dark.css" "enableSourceMap" true ) }}
83 {{ $styles := resources.Get "scss/coder-dark.scss" | resources.ExecuteAsTemplate "style.coder-dark.css" . | toCSS $cssOpts }}
84 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" media="screen">
85 {{ else }}
86 {{ $cssOpts := (dict "targetPath" "css/coder-dark.css" ) }}
87 {{ $styles := resources.Get "scss/coder-dark.scss" | resources.ExecuteAsTemplate "style.coder-dark.css" . | toCSS $cssOpts | minify | fingerprint }}
88 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Integrity }}" crossorigin="anonymous" media="screen" />
89 {{ end }}
90 {{ end }}
91
92 {{ range .Site.Params.customCSS }}
93 <link rel="stylesheet" href="{{ . | relURL }}" />
94 {{ end }}
95
96 {{ range .Site.Params.customSCSS }}
97 {{/* We don't change the targetPath to because it's transparent to users */}}
98 {{ if $.Site.IsServer }}
99 {{ $cssOpts := (dict "enableSourceMap" true ) }}
100 {{ $styles := resources.Get . | toCSS $cssOpts }}
101 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" media="screen">
102 {{ else }}
103 {{ $styles := resources.Get . | toCSS | minify | fingerprint }}
104 <link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Integrity }}" crossorigin="anonymous" media="screen" />
105 {{ end }}
106 {{ end }}
107
108 <link rel="icon" type="image/png" href="{{ .Site.Params.favicon_32 | default "/images/favicon-32x32.png" | relURL }}" sizes="32x32">
109 <link rel="icon" type="image/png" href="{{ .Site.Params.favicon_16 | default "/images/favicon-16x16.png" | relURL }}" sizes="16x16">
110
111 <link rel="apple-touch-icon" href="{{ .Site.Params.touchicon | default "/images/apple-touch-icon.png" | relURL }}">
112 <link rel="apple-touch-icon" sizes="180x180" href="{{ .Site.Params.touchicon | default "/images/apple-touch-icon.png" | relURL }}">
113
114 {{ range .AlternativeOutputFormats -}}
115 {{ printf `<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
116 {{ end -}}
117
118 {{ if .Site.Params.enableTwemoji }}
119 <script defer src="https://twemoji.maxcdn.com/v/13.0.2/twemoji.min.js"
120 integrity="sha384-wyB/MspSJ/r2bT2kCj44qtsYRYlpzO2oAPhRj5myrWD63dt6qWv4x8AZe7Fl3K3b" crossorigin="anonymous"></script>
121 {{ end }}
122
123 {{ hugo.Generator }}
124 </head>
125
126 {{ $csClass := "colorscheme-light" }}
127 {{ if eq .Site.Params.colorScheme "dark" }}
128 {{ $csClass = "colorscheme-dark" }}
129 {{ else if eq .Site.Params.colorScheme "auto" }}
130 {{ $csClass = "colorscheme-auto" }}
131 {{ end }}
132 <body class="preload-transitions {{ $csClass }}{{ if .Site.Params.rtl }} rtl{{ end }}"
133 onload="{{ if .Site.Params.enableTwemoji }} twemoji.parse(document.body); {{ end }}"
134 >
135 <div id=fireworksContainer style="position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 2; pointer-events: none;"></div>
136 <!--
137 <div id="snow" style="position: absolute; top: 0; left: 0; height: 100vh; width: 100vw; --s: 10s; --w: 50vw; --d: 0s;"></div>
138 -->
139 {{ partial "float" . }}
140 <main class="wrapper">
141 {{ partial "header.html" . }}
142
143 <div class="content" style="z-index: 3;">
144 {{ block "content" . }}{{ end }}
145 </div>
146
147 {{ partial "footer.html" . }}
148 </main>
149
150 {{ if .Site.IsServer }}
151 {{ $script := resources.Get "js/coder.js" }}
152 <script src="{{ $script.RelPermalink }}"></script>
153 {{ else }}
154 {{ $script := resources.Get "js/coder.js" | minify | fingerprint }}
155 <script src="{{ $script.RelPermalink }}" integrity="{{ $script.Data.Integrity }}"></script>
156 {{ end }}
157
158 {{ range .Site.Params.customJS }}
159 <script src="{{ . | relURL }}"></script>
160 {{ end }}
161
162 {{ template "_internal/google_analytics.html" . }}
163
164 {{ if and .Site.Params.fathomAnalytics .Site.Params.fathomAnalytics.siteID }}
165 {{- partial "analytics/fathom" . -}}
166 {{ end }}
167
168 {{ if and .Site.Params.plausibleAnalytics .Site.Params.plausibleAnalytics.domain }}
169 {{- partial "analytics/plausible" . -}}
170 {{ end }}
171
172 {{ if and .Site.Params.goatCounter .Site.Params.goatCounter.code }}
173 {{- partial "analytics/goatcounter" . -}}
174 {{ end }}
175
176 {{ if and .Site.Params.cloudflare .Site.Params.cloudflare.token }}
177 {{- partial "analytics/cloudflare" . -}}
178 {{ end }}
179
180 {{ if and .Site.Params.matomo .Site.Params.matomo.serverURL }}
181 {{- partial "analytics/matomo" . -}}
182 {{ end }}
183
184 {{ if and .Site.Params.googleTagManager .Site.Params.googleTagManager.id }}
185 {{- partial "analytics/googletagmanager" . -}}
186 {{ end }}
187 {{ if eq .RelPermalink "/" }}
188 <script src="https://cdn.jsdelivr.net/npm/fireworks-js@latest/dist/fireworks.js"></script>
189 <script>
190 const c = document.querySelector("#fireworksContainer")
191 const f = new Fireworks(c, {
192 "hue": {
193 "min": 0,
194 "max": 345
195 },
196 "delay": {
197 "min": 15,
198 "max": 20
199 },
200 "rocketsPoint": 27,
201 "opacity": 0.5,
202 "speed": 15,
203 "acceleration": 1.1,
204 "friction": 0.97,
205 "gravity": 1.5,
206 "particles": 150,
207 "trace": 6,
208 "explosion": 7,
209 "autoresize": true,
210 "brightness": {
211 "min": 50,
212 "max": 80,
213 "decay": {
214 "min": 0.015,
215 "max": 0.03
216 }
217 },
218 })
219 f._randomRocketsPoint = true
220 f.start()
221 </script>
222 {{ end }}
223 <!--
224 <script>
225 function r(min, max) {
226 return Math.random() * (max - min) + min;
227 }
228
229 for(const _ of Array(250).fill(0)) {
230 const el = document.createElement("div");
231 el.className = "snow";
232 el.style = `--x: ${r(0, 200)}vw; --y: -${r(0, 100)}vh; --d: ${r(-20, 20)}s; --w: ${r(40, 70)}vw; --s: ${r(12, 20)}s;`;
233 snow.appendChild(el);
234 }
235 </script>
236 -->
237 </body>
238 </html>