diff options
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | public/footnotes.js | 69 | ||||
| -rw-r--r-- | public/main.css | 66 | ||||
| -rw-r--r-- | public/style.css | 664 | ||||
| -rw-r--r-- | public/styles/terminal.css | 5 | ||||
| -rw-r--r-- | website.go | 42 | ||||
| -rw-r--r-- | website.templ | 32 | ||||
| -rw-r--r-- | website_templ.go | 317 |
9 files changed, 971 insertions, 227 deletions
@@ -4,5 +4,6 @@ go 1.26.8 require ( github.com/a-h/templ v0.3.1070 // indirect + github.com/yuin/goldmark v1.8.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -1,5 +1,7 @@ github.com/a-h/templ v0.3.1070 h1:3iCOXHXqFXa99OQzgkUOLJbNzv/QjFGLwKZkBAg+ADA= github.com/a-h/templ v0.3.1070/go.mod h1:iIqB3g2RHBe/WlnPwa+Bvhh1TKXHWLRnBD9NWHOLm78= +github.com/yuin/goldmark v1.8.6 h1:d0VcaP1sx9GkFVkoW+KtggpGi2KZ965i14b0+bDQST4= +github.com/yuin/goldmark v1.8.6/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/public/footnotes.js b/public/footnotes.js new file mode 100644 index 0000000..50f709e --- /dev/null +++ b/public/footnotes.js @@ -0,0 +1,69 @@ +document.addEventListener("DOMContentLoaded", () => { + const area = document.querySelector("[data-scroll-area]"); + const refs = [...document.querySelectorAll("a.footnote-ref")]; + if (!area || refs.length === 0) return; + + const panel = document.createElement("div"); + panel.className = "sidenotes"; + document.body.append(panel); + + const items = refs.map((ref) => { + ref.addEventListener("click", (e) => e.preventDefault()); + + const note = document.getElementById(ref.getAttribute("href").slice(1)); + const num = document.createElement("span"); + num.className = "sidenote-num"; + num.textContent = ref.textContent; + + const body = document.createElement("div"); + body.append(...note.cloneNode(true).childNodes); + body.querySelector(".footnote-backref")?.remove(); + + const el = document.createElement("div"); + el.className = "sidenote"; + el.append(num, body); + panel.append(el); + return { ref, el }; + }); + + const gap = 6; + let queued = false; + + const layout = () => { + queued = false; + const rect = area.getBoundingClientRect(); + const frame = document.querySelector(".terminal").getBoundingClientRect(); + const rem = parseFloat(getComputedStyle(document.documentElement).fontSize); + const left = frame.right + rem; + + Object.assign(panel.style, { + left: `${left}px`, + top: `${rect.top}px`, + width: `${window.innerWidth - left - rem}px`, + height: `${rect.height}px`, + }); + + let bottom = -Infinity; + for (const { ref, el } of items) { + const top = Math.max( + ref.getBoundingClientRect().top - rect.top, + bottom + gap, + ); + el.style.top = `${top}px`; + bottom = top + el.offsetHeight; + } + }; + + const schedule = () => { + if (!queued) { + queued = true; + requestAnimationFrame(layout); + } + }; + + area.addEventListener("scroll", schedule, { passive: true }); + window.addEventListener("resize", schedule); + new ResizeObserver(schedule).observe(area); + document.fonts?.ready.then(schedule); + layout(); +}); diff --git a/public/main.css b/public/main.css index 772f896..8f9bb7d 100644 --- a/public/main.css +++ b/public/main.css @@ -6,7 +6,67 @@ @source "../**/*.go"; @source "../**/*.templ"; -@keyframes pop { 50% { transform: scale(1.3); } } -[data-copied] svg { animation: pop 0.25s; } +@keyframes pop { + 50% { + transform: scale(1.3); + } +} +[data-copied] svg { + animation: pop 0.25s; +} -@keyframes bump { 50% { transform: scale(1.03); } } +@keyframes bump { + 50% { + transform: scale(1.03); + } +} + +@plugin "@tailwindcss/typography"; + +.prose { + --tw-prose-body: var(--text); + --tw-prose-headings: var(--primary); + --tw-prose-links: var(--secondary); + --tw-prose-bold: var(--text); + --tw-prose-bullets: var(--alt); + --tw-prose-counters: var(--alt); + --tw-prose-hr: var(--alt); + --tw-prose-quotes: var(--text); + --tw-prose-quote-borders: var(--alt); + --tw-prose-captions: var(--alt); + --tw-prose-code: var(--extra); + --tw-prose-pre-code: var(--text); + --tw-prose-pre-bg: rgb(0 0 0 / 0.3); + --tw-prose-th-borders: var(--alt); + --tw-prose-td-borders: var(--alt); +} + +.js .footnotes { + display: none; +} + +.sidenotes { + position: fixed; + overflow: hidden; + pointer-events: none; +} + +.sidenote { + position: absolute; + left: 0; + right: 0; + display: flex; + gap: 1ch; + padding: 0.4rem 0.6rem; + border: 0.1rem solid var(--alt); + background: var(--background); + font-family: var(--font-normal); + font-size: 14px; + line-height: 1.4; + pointer-events: auto; +} + +.sidenote-num { + flex-shrink: 0; + color: var(--secondary); +} diff --git a/public/style.css b/public/style.css index db025d0..f2d0a22 100644 --- a/public/style.css +++ b/public/style.css @@ -7,32 +7,14 @@ sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; - --color-red-400: oklch(70.4% 0.191 22.216); - --color-red-800: oklch(44.4% 0.177 26.899); - --color-red-950: oklch(25.8% 0.092 26.042); - --color-emerald-400: oklch(76.5% 0.177 163.223); - --color-emerald-800: oklch(43.2% 0.095 166.913); - --color-emerald-950: oklch(26.2% 0.051 172.552); --color-gray-700: oklch(37.3% 0.034 259.733); - --color-zinc-200: oklch(92% 0.004 286.32); - --color-zinc-300: oklch(87.1% 0.006 286.286); - --color-zinc-400: oklch(70.5% 0.015 286.067); - --color-zinc-500: oklch(55.2% 0.016 285.938); --color-black: #000; --color-white: #fff; --spacing: 0.25rem; --container-3xl: 48rem; - --text-xs: 0.75rem; - --text-xs--line-height: calc(1 / 0.75); - --text-sm: 0.875rem; - --text-sm--line-height: calc(1.25 / 0.875); - --text-2xl: 1.5rem; - --text-2xl--line-height: calc(2 / 1.5); --font-weight-normal: 400; --font-weight-bold: 700; - --tracking-wider: 0.05em; --leading-relaxed: 1.625; - --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); @@ -188,9 +170,6 @@ } } @layer utilities { - .pointer-events-none { - pointer-events: none; - } .invisible { visibility: hidden; } @@ -212,9 +191,6 @@ .inset-x-\[0\.3rem\] { inset-inline: 0.3rem; } - .top-1 { - top: var(--spacing); - } .top-1\/2 { top: calc(1 / 2 * 100%); } @@ -227,6 +203,9 @@ .top-\[0\.6rem\] { top: 0.6rem; } + .top-\[calc\(50\%-20rem\)\] { + top: calc(50% - 20rem); + } .right-\[0\.6rem\] { right: 0.6rem; } @@ -248,6 +227,9 @@ .left-\[0\.625rem\] { left: 0.625rem; } + .left-\[calc\(50\%\+38\.5rem\)\] { + left: calc(50% + 38.5rem); + } .z-10 { z-index: 10; } @@ -287,12 +269,430 @@ .my-\[5vw\] { margin-block: 5vw; } + .prose { + color: var(--tw-prose-body); + max-width: 65ch; + :where(p):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; + } + :where([class~="lead"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; + } + :where(a):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; + } + :where(strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; + } + :where(a strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(blockquote strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(thead th strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(ol):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; + } + :where(ol[type="A"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: upper-alpha; + } + :where(ol[type="a"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: lower-alpha; + } + :where(ol[type="A" s]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: upper-alpha; + } + :where(ol[type="a" s]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: lower-alpha; + } + :where(ol[type="I"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: upper-roman; + } + :where(ol[type="i"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: lower-roman; + } + :where(ol[type="I" s]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: upper-roman; + } + :where(ol[type="i" s]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: lower-roman; + } + :where(ol[type="1"]):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: decimal; + } + :where(ul):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; + } + :where(ol > li):not(:where([class~="not-prose"], [class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); + } + :where(ul > li):not(:where([class~="not-prose"], [class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); + } + :where(dt):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.25em; + } + :where(hr):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; + } + :where(blockquote):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-inline-start-width: 0.25rem; + border-inline-start-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-inline-start: 1em; + } + :where(blockquote p:first-of-type):not(:where([class~="not-prose"], [class~="not-prose"] *))::before { + content: open-quote; + } + :where(blockquote p:last-of-type):not(:where([class~="not-prose"], [class~="not-prose"] *))::after { + content: close-quote; + } + :where(h1):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; + } + :where(h1 strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 900; + color: inherit; + } + :where(h2):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; + } + :where(h2 strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 800; + color: inherit; + } + :where(h3):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; + } + :where(h3 strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 700; + color: inherit; + } + :where(h4):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; + } + :where(h4 strong):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 700; + color: inherit; + } + :where(img):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(picture):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + display: block; + margin-top: 2em; + margin-bottom: 2em; + } + :where(video):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(kbd):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + font-weight: 500; + font-family: inherit; + color: var(--tw-prose-kbd); + box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows); + font-size: 0.875em; + border-radius: 0.3125rem; + padding-top: 0.1875em; + padding-inline-end: 0.375em; + padding-bottom: 0.1875em; + padding-inline-start: 0.375em; + } + :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; + } + :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *))::before { + content: "`"; + } + :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *))::after { + content: "`"; + } + :where(a code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(h1 code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(h2 code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + font-size: 0.875em; + } + :where(h3 code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + font-size: 0.9em; + } + :where(h4 code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(blockquote code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(thead th code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: inherit; + } + :where(pre):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-inline-end: 1.1428571em; + padding-bottom: 0.8571429em; + padding-inline-start: 1.1428571em; + } + :where(pre code):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; + } + :where(pre code):not(:where([class~="not-prose"], [class~="not-prose"] *))::before { + content: none; + } + :where(pre code):not(:where([class~="not-prose"], [class~="not-prose"] *))::after { + content: none; + } + :where(table):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; + } + :where(thead):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); + } + :where(thead th):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; + } + :where(tbody tr):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); + } + :where(tbody tr:last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + border-bottom-width: 0; + } + :where(tbody td):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + vertical-align: baseline; + } + :where(tfoot):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); + } + :where(tfoot td):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + vertical-align: top; + } + :where(th, td):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + text-align: start; + } + :where(figure > *):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; + } + :where(figcaption):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; + } + --tw-prose-body: oklch(37.3% 0.034 259.733); + --tw-prose-headings: oklch(21% 0.034 264.665); + --tw-prose-lead: oklch(44.6% 0.03 256.802); + --tw-prose-links: oklch(21% 0.034 264.665); + --tw-prose-bold: oklch(21% 0.034 264.665); + --tw-prose-counters: oklch(55.1% 0.027 264.364); + --tw-prose-bullets: oklch(87.2% 0.01 258.338); + --tw-prose-hr: oklch(92.8% 0.006 264.531); + --tw-prose-quotes: oklch(21% 0.034 264.665); + --tw-prose-quote-borders: oklch(92.8% 0.006 264.531); + --tw-prose-captions: oklch(55.1% 0.027 264.364); + --tw-prose-kbd: oklch(21% 0.034 264.665); + --tw-prose-kbd-shadows: color-mix(in oklab, oklch(21% 0.034 264.665) 10%, transparent); + --tw-prose-code: oklch(21% 0.034 264.665); + --tw-prose-pre-code: oklch(92.8% 0.006 264.531); + --tw-prose-pre-bg: oklch(27.8% 0.033 256.848); + --tw-prose-th-borders: oklch(87.2% 0.01 258.338); + --tw-prose-td-borders: oklch(92.8% 0.006 264.531); + --tw-prose-invert-body: oklch(87.2% 0.01 258.338); + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: oklch(70.7% 0.022 261.325); + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: oklch(70.7% 0.022 261.325); + --tw-prose-invert-bullets: oklch(44.6% 0.03 256.802); + --tw-prose-invert-hr: oklch(37.3% 0.034 259.733); + --tw-prose-invert-quotes: oklch(96.7% 0.003 264.542); + --tw-prose-invert-quote-borders: oklch(37.3% 0.034 259.733); + --tw-prose-invert-captions: oklch(70.7% 0.022 261.325); + --tw-prose-invert-kbd: #fff; + --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%); + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: oklch(87.2% 0.01 258.338); + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: oklch(44.6% 0.03 256.802); + --tw-prose-invert-td-borders: oklch(37.3% 0.034 259.733); + font-size: 1rem; + line-height: 1.75; + :where(picture > img):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; + } + :where(li):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; + } + :where(ol > li):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-start: 0.375em; + } + :where(ul > li):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-start: 0.375em; + } + :where(.prose > ul > li p):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 1.25em; + } + :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-bottom: 1.25em; + } + :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 1.25em; + } + :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-bottom: 1.25em; + } + :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + :where(dl):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; + } + :where(dd):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0.5em; + padding-inline-start: 1.625em; + } + :where(hr + *):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + } + :where(h2 + *):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + } + :where(h3 + *):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + } + :where(h4 + *):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + } + :where(thead th:first-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-start: 0; + } + :where(thead th:last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-end: 0; + } + :where(tbody td, tfoot td):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-top: 0.5714286em; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; + } + :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-start: 0; + } + :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + padding-inline-end: 0; + } + :where(figure):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; + } + :where(.prose > :first-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-top: 0; + } + :where(.prose > :last-child):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + margin-bottom: 0; + } + } .mt-\[0\.5rem\] { margin-top: 0.5rem; } .mt-\[0\.625vw\] { margin-top: 0.625vw; } + .mt-\[1rem\] { + margin-top: 1rem; + } .mt-\[1vw\] { margin-top: 1vw; } @@ -395,6 +795,9 @@ .h-full { height: 100%; } + .max-h-\[40rem\] { + max-height: 40rem; + } .max-h-\[80svh\] { max-height: 80svh; } @@ -407,6 +810,9 @@ .w-8 { width: calc(var(--spacing) * 8); } + .w-\[10\.5rem\] { + width: 10.5rem; + } .w-\[30\%\] { width: 30%; } @@ -440,19 +846,9 @@ .flex-1 { flex: 1; } - .flex-shrink { - flex-shrink: 1; - } .shrink-0 { flex-shrink: 0; } - .border-collapse { - border-collapse: collapse; - } - .-translate-y-1 { - --tw-translate-y: calc(var(--spacing) * -1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } .-translate-y-1\/2 { --tw-translate-y: calc(calc(1 / 2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); @@ -469,9 +865,6 @@ .cursor-grab { cursor: grab; } - .cursor-not-allowed { - cursor: not-allowed; - } .cursor-pointer { cursor: pointer; } @@ -511,6 +904,9 @@ .justify-between { justify-content: space-between; } + .justify-end { + justify-content: flex-end; + } .gap-4 { gap: calc(var(--spacing) * 4); } @@ -544,6 +940,9 @@ .gap-x-\[1ch\] { column-gap: 1ch; } + .gap-x-\[1rem\] { + column-gap: 1rem; + } .gap-x-\[2rem\] { column-gap: 2rem; } @@ -641,24 +1040,6 @@ border-color: color-mix(in oklab, var(--alt) 30%, transparent); } } - .border-\(--alt\)\/60 { - border-color: var(--alt); - @supports (color: color-mix(in lab, red, red)) { - border-color: color-mix(in oklab, var(--alt) 60%, transparent); - } - } - .border-\(--alt\)\/70 { - border-color: var(--alt); - @supports (color: color-mix(in lab, red, red)) { - border-color: color-mix(in oklab, var(--alt) 70%, transparent); - } - } - .border-\(--alt\)\/80 { - border-color: var(--alt); - @supports (color: color-mix(in lab, red, red)) { - border-color: color-mix(in oklab, var(--alt) 80%, transparent); - } - } .border-\(--secondary\)\/60 { border-color: var(--secondary); @supports (color: color-mix(in lab, red, red)) { @@ -698,27 +1079,6 @@ .bg-\[var\(--text\)\] { background-color: var(--text); } - .bg-black { - background-color: var(--color-black); - } - .bg-black\/0 { - background-color: color-mix(in srgb, #000 0%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-black) 0%, transparent); - } - } - .bg-black\/10 { - background-color: color-mix(in srgb, #000 10%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-black) 10%, transparent); - } - } - .bg-black\/15 { - background-color: color-mix(in srgb, #000 15%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-black) 15%, transparent); - } - } .bg-black\/20 { background-color: color-mix(in srgb, #000 20%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -731,33 +1091,12 @@ background-color: color-mix(in oklab, var(--color-black) 30%, transparent); } } - .bg-black\/50 { - background-color: color-mix(in srgb, #000 50%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-black) 50%, transparent); - } - } - .bg-white { - background-color: var(--color-white); - } .bg-white\/2 { background-color: color-mix(in srgb, #fff 2%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-white) 2%, transparent); } } - .bg-white\/5 { - background-color: color-mix(in srgb, #fff 5%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-white) 5%, transparent); - } - } - .bg-white\/15 { - background-color: color-mix(in srgb, #fff 15%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-white) 15%, transparent); - } - } .bg-white\/\[0\.03\] { background-color: color-mix(in srgb, #fff 3%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -809,9 +1148,6 @@ .p-\[3vw\] { padding: 3vw; } - .px-3 { - padding-inline: calc(var(--spacing) * 3); - } .px-3\.5 { padding-inline: calc(var(--spacing) * 3.5); } @@ -869,6 +1205,9 @@ .text-right { text-align: right; } + .font-\(family-name\:--font-normal\) { + font-family: var(--font-normal); + } .font-\[\'JetBrains_Mono\'\] { font-family: 'JetBrains Mono'; } @@ -908,6 +1247,12 @@ .text-\[5vw\] { font-size: 5vw; } + .text-\[14px\] { + font-size: 14px; + } + .text-\[18px\] { + font-size: 18px; + } .text-\[60\%\] { font-size: 60%; } @@ -935,6 +1280,10 @@ .text-\[170\%\] { font-size: 170%; } + .leading-\[1\.7\] { + --tw-leading: 1.7; + line-height: 1.7; + } .leading-\[normal\] { --tw-leading: normal; line-height: normal; @@ -963,12 +1312,6 @@ .text-\(--alt\) { color: var(--alt); } - .text-\(--alt\)\/20 { - color: var(--alt); - @supports (color: color-mix(in lab, red, red)) { - color: color-mix(in oklab, var(--alt) 20%, transparent); - } - } .text-\(--alt\)\/80 { color: var(--alt); @supports (color: color-mix(in lab, red, red)) { @@ -993,15 +1336,6 @@ .text-\[\#5C6CC1\] { color: #5C6CC1; } - .text-\[\#8eb0c8\] { - color: #8eb0c8; - } - .text-\[\#9A38F4\] { - color: #9A38F4; - } - .text-\[\#9e55e1\] { - color: #9e55e1; - } .text-\[\#46d46c\] { color: #46d46c; } @@ -1014,24 +1348,9 @@ .text-\[\#897ccb\] { color: #897ccb; } - .text-\[\#5079DB\] { - color: #5079DB; - } - .text-\[\#5487ac\] { - color: #5487ac; - } .text-\[\#5874FF\] { color: #5874FF; } - .text-\[\#5947B4\] { - color: #5947B4; - } - .text-\[\#7847D1\] { - color: #7847D1; - } - .text-\[\#487494\] { - color: #487494; - } .text-\[\#BDC3C7\] { color: #BDC3C7; } @@ -1044,9 +1363,6 @@ .text-\[\#D27D9B\] { color: #D27D9B; } - .text-\[\#DD6718\] { - color: #DD6718; - } .text-\[\#ED532D\] { color: #ED532D; } @@ -1068,12 +1384,6 @@ .text-\[\#a34eeb\] { color: #a34eeb; } - .text-\[\#ad72c7\] { - color: #ad72c7; - } - .text-\[\#b56df7\] { - color: #b56df7; - } .text-\[\%v\] { color: %v; } @@ -1089,15 +1399,9 @@ .no-underline { text-decoration-line: none; } - .underline { - text-decoration-line: underline; - } .opacity-0 { opacity: 0%; } - .opacity-40 { - opacity: 40%; - } .shadow-\[0_0_1\.5rem_color-mix\(in_srgb\,var\(--accent\)_25\%\,transparent\)\] { --tw-shadow: 0 0 1.5rem var(--tw-shadow-color, var(--accent)); @supports (color: color-mix(in lab, red, red)) { @@ -1105,10 +1409,6 @@ } box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } - .outline { - outline-style: var(--tw-outline-style); - outline-width: 1px; - } .transition-colors { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -1118,10 +1418,6 @@ --tw-duration: 150ms; transition-duration: 150ms; } - .select-none { - -webkit-user-select: none; - user-select: none; - } .select-text { -webkit-user-select: text; user-select: text; @@ -1212,14 +1508,6 @@ background-color: color-mix(in oklab, var(--color-white) 10%, transparent); } } - .hover\:bg-white\/20:hover { - background-color: color-mix(in srgb, #fff 20%, transparent); - } - @supports (color: color-mix(in lab, red, red)) { - .hover\:bg-white\/20:hover { - background-color: color-mix(in oklab, var(--color-white) 20%, transparent); - } - } .hover\:text-\(--accent\):hover { color: var(--accent); } @@ -1429,6 +1717,49 @@ transform: scale(1.03); } } +.prose { + --tw-prose-body: var(--text); + --tw-prose-headings: var(--primary); + --tw-prose-links: var(--secondary); + --tw-prose-bold: var(--text); + --tw-prose-bullets: var(--alt); + --tw-prose-counters: var(--alt); + --tw-prose-hr: var(--alt); + --tw-prose-quotes: var(--text); + --tw-prose-quote-borders: var(--alt); + --tw-prose-captions: var(--alt); + --tw-prose-code: var(--extra); + --tw-prose-pre-code: var(--text); + --tw-prose-pre-bg: rgb(0 0 0 / 0.3); + --tw-prose-th-borders: var(--alt); + --tw-prose-td-borders: var(--alt); +} +.js .footnotes { + display: none; +} +.sidenotes { + position: fixed; + overflow: hidden; + pointer-events: none; +} +.sidenote { + position: absolute; + left: 0; + right: 0; + display: flex; + gap: 1ch; + padding: 0.4rem 0.6rem; + border: 0.1rem solid var(--alt); + background: var(--background); + font-family: var(--font-normal); + font-size: 14px; + line-height: 1.4; + pointer-events: auto; +} +.sidenote-num { + flex-shrink: 0; + color: var(--secondary); +} @property --tw-translate-x { syntax: "*"; inherits: false; @@ -1562,11 +1893,6 @@ inherits: false; initial-value: 0 0 #0000; } -@property --tw-outline-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} @property --tw-duration { syntax: "*"; inherits: false; @@ -1576,11 +1902,6 @@ initial-value: ""; inherits: false; } -@keyframes pulse { - 50% { - opacity: 0.5; - } -} @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { @@ -1613,7 +1934,6 @@ --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; - --tw-outline-style: solid; --tw-duration: initial; --tw-content: ""; } diff --git a/public/styles/terminal.css b/public/styles/terminal.css index e0e80aa..e272b9c 100644 --- a/public/styles/terminal.css +++ b/public/styles/terminal.css @@ -14,13 +14,14 @@ --text: #ffffff; --alt: #999999; --background: #000000; - --font: "Jetbrains Mono", monospace; + --font-mono: "Jetbrains Mono", monospace; + --font-normal: "Jetbrains Mono"; } html { background-color: var(--background); color: var(--text); - font-family: var(--font); + font-family: var(--font-mono); user-select: none; font-size: 1vw; @@ -1,6 +1,7 @@ package main import ( + "bytes" "cmp" "embed" "encoding/json" @@ -17,6 +18,9 @@ import ( "time" "github.com/a-h/templ" + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/extension" + "github.com/yuin/goldmark/renderer/html" "gopkg.in/yaml.v3" ) @@ -159,14 +163,34 @@ type Blog struct { Desc string Date time.Time Body string // raw markdown for rendering + HTML string // rendered body } +var md = goldmark.New( + goldmark.WithExtensions(extension.GFM, extension.Footnote), + goldmark.WithRendererOptions(html.WithUnsafe()), +) + type frontmatter struct { Title string `yaml:"title"` Desc string `yaml:"description"` Date time.Time `yaml:"date"` } +func findBlog(blogs []Blog, slug string) (blog, prev, next *Blog) { + i := slices.IndexFunc(blogs, func(b Blog) bool { return b.Slug == slug }) + if i < 0 { + return nil, nil, nil + } + if i+1 < len(blogs) { + prev = &blogs[i+1] // older + } + if i > 0 { + next = &blogs[i-1] // newer + } + return &blogs[i], prev, next +} + var datePrefix = regexp.MustCompile(`^(\d{4}-\d{2}-\d{2})-(.+)\.md$`) func parseBlog(name, raw string) (Blog, error) { @@ -182,6 +206,12 @@ func parseBlog(name, raw string) (Blog, error) { } } + var buf bytes.Buffer + if err := md.Convert([]byte(body), &buf); err != nil { + return Blog{}, err + } + HTML := buf.String() + slug := strings.TrimSuffix(name, ".md") date := frontmatter.Date // frontmatter wins if match := datePrefix.FindStringSubmatch(name); match != nil { @@ -204,6 +234,7 @@ func parseBlog(name, raw string) (Blog, error) { Date: date, Body: body, Desc: frontmatter.Desc, + HTML: HTML, }, nil } @@ -269,7 +300,7 @@ var projects = []Project{ Slug: "krypton", Title: "Krypton", Category: "Programming Language Compiler", - Desc: "A modern Minecraft creator event. As a developer, I helped with minor improvements to the cosmetics system. ", + Desc: "", // Icon: IconCpu("text-[#F5A670] self-center"), Icon: IconKrypton(), Tags: []ProjectTag{ @@ -564,6 +595,15 @@ func main() { BlogsPage(currentStyle(r), getBlogs()).Render(r.Context(), w) }) + mux.HandleFunc("GET /blogs/{slug}", func(w http.ResponseWriter, r *http.Request) { + blog, prev, next := findBlog(getBlogs(), r.PathValue("slug")) + if blog == nil { + notFoundHandler(w, r) + return + } + BlogPage(currentStyle(r), *blog, prev, next).Render(r.Context(), w) + }) + mux.HandleFunc("GET /theme/{name}", styleHandler("theme", func(n string) (map[string]string, bool) { theme, ok := GetTheme(n) return theme.Vars(), ok diff --git a/website.templ b/website.templ index 1371351..454568c 100644 --- a/website.templ +++ b/website.templ @@ -23,6 +23,7 @@ templ HeadComponent(title string, description string) { <script src="/public/theme.js" defer></script> <script src="/public/scrollbar.js" defer></script> <script src="/public/my_uptime.js" defer></script> + <script src="/public/footnotes.js" defer></script> <link rel="stylesheet" href="/public/style.css"/> { children... } </head> @@ -750,3 +751,34 @@ templ Icon(color string) { { children... } </svg> } + +templ BlogPage(style Style, blog Blog, prev *Blog, next *Blog) { + @TerminalLayout(style, blog.Title) { + @ScrollBox("") { + @BlogItem("", blog, "mb-[1rem]") + <article class="prose select-text font-(family-name:--font-normal) text-[18px] leading-[1.7]"> + @templ.Raw(blog.HTML) + </article> + <div class="grid grid-cols-2 gap-x-[1rem] mt-[1rem]"> + @BlogNav("Previous Blog", prev, "") + @BlogNav("Next Blog", next, "") + </div> + } + } +} + +templ BlogNav(label string, blog *Blog, extra string) { + @TerminalBorder(label, "", extra) { + if blog != nil { + <a href={ templ.SafeURL("/blogs/" + blog.Slug) }>vim ~/blogs/{ blog.Slug }</a> + } + } +} + +templ FootnotePanel() { + <aside data-footnote-panel class="hidden fixed left-[calc(50%+38.5rem)] top-[calc(50%-20rem)] w-[10.5rem] max-h-[40rem] overflow-y-auto"> + @TerminalBorder("note", "", "text-[14px]") { + <div data-footnote-body class="font-(family-name:--font-normal)"></div> + } + </aside> +} diff --git a/website_templ.go b/website_templ.go index e914080..62d81a4 100644 --- a/website_templ.go +++ b/website_templ.go @@ -81,7 +81,7 @@ func HeadComponent(title string, description string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\"><meta property=\"og:type\" content=\"website\"><meta property=\"og:url\" content=\"https://kyren.codes/\"><meta property=\"og:image\" content=\"https://kyren.codes/public/image.png\"><meta property=\"og:image:alt\" content=\"a cyan sphere with a dark background\"><meta property=\"og:site_name\" content=\"Kyren's Website\"><script src=\"/public/copy.js\" defer></script><script src=\"/public/theme.js\" defer></script><script src=\"/public/scrollbar.js\" defer></script><script src=\"/public/my_uptime.js\" defer></script><link rel=\"stylesheet\" href=\"/public/style.css\">") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\"><meta property=\"og:type\" content=\"website\"><meta property=\"og:url\" content=\"https://kyren.codes/\"><meta property=\"og:image\" content=\"https://kyren.codes/public/image.png\"><meta property=\"og:image:alt\" content=\"a cyan sphere with a dark background\"><meta property=\"og:site_name\" content=\"Kyren's Website\"><script src=\"/public/copy.js\" defer></script><script src=\"/public/theme.js\" defer></script><script src=\"/public/scrollbar.js\" defer></script><script src=\"/public/my_uptime.js\" defer></script><script src=\"/public/footnotes.js\" defer></script><link rel=\"stylesheet\" href=\"/public/style.css\">") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -145,7 +145,7 @@ func BlogItem(header string, blog Blog, extra string) templ.Component { var templ_7745c5c3_Var8 templ.SafeURL templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/blogs/" + blog.Slug)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 42, Col: 49} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 43, Col: 49} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -158,7 +158,7 @@ func BlogItem(header string, blog Blog, extra string) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(blog.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 44, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 45, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -171,7 +171,7 @@ func BlogItem(header string, blog Blog, extra string) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(blog.Desc) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 46, Col: 45} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 47, Col: 45} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -219,7 +219,7 @@ func Link(href string, newTab bool) templ.Component { var templ_7745c5c3_Var12 templ.SafeURL templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 54, Col: 28} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 55, Col: 28} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) if templ_7745c5c3_Err != nil { @@ -353,7 +353,7 @@ func TerminalBorderForBlog(header string, footer string, extra string, enable bo var templ_7745c5c3_Var19 string templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(header) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 73, Col: 132} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 74, Col: 132} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19)) if templ_7745c5c3_Err != nil { @@ -366,7 +366,7 @@ func TerminalBorderForBlog(header string, footer string, extra string, enable bo var templ_7745c5c3_Var20 string templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(footer) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 74, Col: 149} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 75, Col: 149} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) if templ_7745c5c3_Err != nil { @@ -458,7 +458,7 @@ func TerminalBorder(header string, footer string, extra string) templ.Component var templ_7745c5c3_Var25 string templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(header) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 91, Col: 137} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 92, Col: 137} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25)) if templ_7745c5c3_Err != nil { @@ -471,7 +471,7 @@ func TerminalBorder(header string, footer string, extra string) templ.Component var templ_7745c5c3_Var26 string templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(footer) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 92, Col: 140} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 93, Col: 140} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26)) if templ_7745c5c3_Err != nil { @@ -567,7 +567,7 @@ func TerminalBorderWithCopy(header string, footer string, extra string, text str var templ_7745c5c3_Var30 templ.SafeURL templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 105, Col: 33} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 106, Col: 33} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30)) if templ_7745c5c3_Err != nil { @@ -593,7 +593,7 @@ func TerminalBorderWithCopy(header string, footer string, extra string, text str var templ_7745c5c3_Var31 string templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.ResolveAttributeValue(text) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 109, Col: 26} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 110, Col: 26} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var31) if templ_7745c5c3_Err != nil { @@ -629,7 +629,7 @@ func TerminalBorderWithCopy(header string, footer string, extra string, text str var templ_7745c5c3_Var32 string templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(text) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 117, Col: 42} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 118, Col: 42} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32) if templ_7745c5c3_Err != nil { @@ -685,7 +685,7 @@ func CopyPre(text string, preClass string) templ.Component { var templ_7745c5c3_Var34 string templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(text) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 126, Col: 39} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 127, Col: 39} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34) if templ_7745c5c3_Err != nil { @@ -757,7 +757,7 @@ func NavLink(href string, label string) templ.Component { var templ_7745c5c3_Var38 templ.SafeURL templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 135, Col: 30} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 136, Col: 30} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38)) if templ_7745c5c3_Err != nil { @@ -770,7 +770,7 @@ func NavLink(href string, label string) templ.Component { var templ_7745c5c3_Var39 string templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 135, Col: 87} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 136, Col: 87} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39)) if templ_7745c5c3_Err != nil { @@ -812,7 +812,7 @@ func Nav(path string) templ.Component { var templ_7745c5c3_Var41 string templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(path) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 140, Col: 14} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 141, Col: 14} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41)) if templ_7745c5c3_Err != nil { @@ -872,7 +872,7 @@ func TerminalLayout(style Style, path string) templ.Component { var templ_7745c5c3_Var43 string templ_7745c5c3_Var43, templ_7745c5c3_Err = templruntime.SanitizeStyleAttributeValues(styleToCss(style)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 153, Col: 42} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 154, Col: 42} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43)) if templ_7745c5c3_Err != nil { @@ -1035,7 +1035,7 @@ func HomePage(style Style, latestBlog *Blog) templ.Component { var templ_7745c5c3_Var52 string templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(fingerprint) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 188, Col: 21} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 189, Col: 21} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52)) if templ_7745c5c3_Err != nil { @@ -1302,7 +1302,7 @@ func HomePage(style Style, latestBlog *Blog) templ.Component { var templ_7745c5c3_Var64 string templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(sshKey) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 237, Col: 12} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 238, Col: 12} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64)) if templ_7745c5c3_Err != nil { @@ -1520,7 +1520,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var71 templ.SafeURL templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/projects/" + project.Slug)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 315, Col: 57} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 316, Col: 57} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71)) if templ_7745c5c3_Err != nil { @@ -1533,7 +1533,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var72 string templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(project.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 315, Col: 173} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 316, Col: 173} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72)) if templ_7745c5c3_Err != nil { @@ -1546,7 +1546,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var73 string templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.JoinStringErrs(project.Category) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 316, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 317, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var73)) if templ_7745c5c3_Err != nil { @@ -1582,7 +1582,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var76 string templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(tag.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 318, Col: 136} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 319, Col: 136} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76)) if templ_7745c5c3_Err != nil { @@ -1628,7 +1628,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var78 string templ_7745c5c3_Var78, templ_7745c5c3_Err = templ.JoinStringErrs(project.Desc) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 328, Col: 55} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 329, Col: 55} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var78)) if templ_7745c5c3_Err != nil { @@ -1679,7 +1679,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var79 string templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.JoinStringErrs(stat.Value) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 346, Col: 61} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 347, Col: 61} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var79)) if templ_7745c5c3_Err != nil { @@ -1692,7 +1692,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var80 string templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.JoinStringErrs(stat.Label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 347, Col: 47} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 348, Col: 47} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var80)) if templ_7745c5c3_Err != nil { @@ -1732,7 +1732,7 @@ func FlagshipProject(project Project, extra string) templ.Component { var templ_7745c5c3_Var82 string templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(flagship.Snippet) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 357, Col: 24} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 358, Col: 24} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82)) if templ_7745c5c3_Err != nil { @@ -1792,7 +1792,7 @@ func VersionTag(project Project) templ.Component { var templ_7745c5c3_Var84 string templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(flagship.Version) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 368, Col: 50} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 369, Col: 50} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84)) if templ_7745c5c3_Err != nil { @@ -1848,7 +1848,7 @@ func DownloadButton(download Download) templ.Component { var templ_7745c5c3_Var87 templ.SafeURL templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(download.URL)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 377, Col: 37} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 378, Col: 37} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87)) if templ_7745c5c3_Err != nil { @@ -1894,7 +1894,7 @@ func DownloadButton(download Download) templ.Component { var templ_7745c5c3_Var89 string templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(download.Label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 390, Col: 24} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 391, Col: 24} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89)) if templ_7745c5c3_Err != nil { @@ -1912,7 +1912,7 @@ func DownloadButton(download Download) templ.Component { var templ_7745c5c3_Var90 string templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinStringErrs(download.Size) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 392, Col: 45} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 393, Col: 45} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90)) if templ_7745c5c3_Err != nil { @@ -2011,7 +2011,7 @@ func IconLink(href string, label string, extra string) templ.Component { var templ_7745c5c3_Var95 templ.SafeURL templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 406, Col: 30} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 407, Col: 30} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95)) if templ_7745c5c3_Err != nil { @@ -2024,7 +2024,7 @@ func IconLink(href string, label string, extra string) templ.Component { var templ_7745c5c3_Var96 string templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.ResolveAttributeValue(label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 406, Col: 93} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 407, Col: 93} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var96) if templ_7745c5c3_Err != nil { @@ -2037,7 +2037,7 @@ func IconLink(href string, label string, extra string) templ.Component { var templ_7745c5c3_Var97 string templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.ResolveAttributeValue(label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 406, Col: 109} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 407, Col: 109} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var97) if templ_7745c5c3_Err != nil { @@ -2319,7 +2319,7 @@ func ProjectItem(project Project, extra string) templ.Component { var templ_7745c5c3_Var109 templ.SafeURL templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(projectURL(project))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 461, Col: 47} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 462, Col: 47} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109)) if templ_7745c5c3_Err != nil { @@ -2342,7 +2342,7 @@ func ProjectItem(project Project, extra string) templ.Component { var templ_7745c5c3_Var110 string templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinStringErrs(project.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 467, Col: 21} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 468, Col: 21} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110)) if templ_7745c5c3_Err != nil { @@ -2355,7 +2355,7 @@ func ProjectItem(project Project, extra string) templ.Component { var templ_7745c5c3_Var111 string templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinStringErrs(project.Category) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 468, Col: 65} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 469, Col: 65} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111)) if templ_7745c5c3_Err != nil { @@ -2391,7 +2391,7 @@ func ProjectItem(project Project, extra string) templ.Component { var templ_7745c5c3_Var114 string templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.JoinStringErrs(tag.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 470, Col: 136} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 471, Col: 136} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var114)) if templ_7745c5c3_Err != nil { @@ -2437,7 +2437,7 @@ func ProjectItem(project Project, extra string) templ.Component { var templ_7745c5c3_Var116 string templ_7745c5c3_Var116, templ_7745c5c3_Err = templ.JoinStringErrs(project.Desc) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 483, Col: 40} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 484, Col: 40} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var116)) if templ_7745c5c3_Err != nil { @@ -2628,7 +2628,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var125 string templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(path) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 518, Col: 20} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 519, Col: 20} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125)) if templ_7745c5c3_Err != nil { @@ -2641,7 +2641,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var126 string templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinStringErrs(path[1:]) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 519, Col: 32} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 520, Col: 32} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126)) if templ_7745c5c3_Err != nil { @@ -2676,7 +2676,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var128 string templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinStringErrs(">") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 525, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 526, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128)) if templ_7745c5c3_Err != nil { @@ -2701,7 +2701,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var130 string templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.JoinStringErrs("cd -") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 528, Col: 16} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 529, Col: 16} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var130)) if templ_7745c5c3_Err != nil { @@ -2720,7 +2720,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var131 string templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.JoinStringErrs(">") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 536, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 537, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var131)) if templ_7745c5c3_Err != nil { @@ -2745,7 +2745,7 @@ func NotFoundPage(style Style, path string) templ.Component { var templ_7745c5c3_Var133 string templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs("cd $HOME") if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 539, Col: 20} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 540, Col: 20} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133)) if templ_7745c5c3_Err != nil { @@ -3767,7 +3767,7 @@ func Fastfetch(rows []FetchRow) templ.Component { var templ_7745c5c3_Var175 string templ_7745c5c3_Var175, templ_7745c5c3_Err = templ.JoinStringErrs(branch(i, len(rows))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 740, Col: 52} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 741, Col: 52} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var175)) if templ_7745c5c3_Err != nil { @@ -3806,7 +3806,7 @@ func Fastfetch(rows []FetchRow) templ.Component { var templ_7745c5c3_Var178 string templ_7745c5c3_Var178, templ_7745c5c3_Err = templ.JoinStringErrs(row.Label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 742, Col: 53} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 743, Col: 53} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var178)) if templ_7745c5c3_Err != nil { @@ -3819,7 +3819,7 @@ func Fastfetch(rows []FetchRow) templ.Component { var templ_7745c5c3_Var179 string templ_7745c5c3_Var179, templ_7745c5c3_Err = templ.ResolveAttributeValue(row.Label) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 743, Col: 23} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 744, Col: 23} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var179) if templ_7745c5c3_Err != nil { @@ -3832,7 +3832,7 @@ func Fastfetch(rows []FetchRow) templ.Component { var templ_7745c5c3_Var180 string templ_7745c5c3_Var180, templ_7745c5c3_Err = templ.JoinStringErrs(row.Value) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 743, Col: 37} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 744, Col: 37} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var180)) if templ_7745c5c3_Err != nil { @@ -3906,4 +3906,223 @@ func Icon(color string) templ.Component { }) } +func BlogPage(style Style, blog Blog, prev *Blog, next *Blog) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var184 := templ.GetChildren(ctx) + if templ_7745c5c3_Var184 == nil { + templ_7745c5c3_Var184 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var185 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var186 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = BlogItem("", blog, "mb-[1rem]").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "<article class=\"prose select-text font-(family-name:--font-normal) text-[18px] leading-[1.7]\">") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templ.Raw(blog.HTML).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "</article><div class=\"grid grid-cols-2 gap-x-[1rem] mt-[1rem]\">") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = BlogNav("Previous Blog", prev, "").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = BlogNav("Next Blog", next, "").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 177, "</div>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = ScrollBox("").Render(templ.WithChildren(ctx, templ_7745c5c3_Var186), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = TerminalLayout(style, blog.Title).Render(templ.WithChildren(ctx, templ_7745c5c3_Var185), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func BlogNav(label string, blog *Blog, extra string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var187 := templ.GetChildren(ctx) + if templ_7745c5c3_Var187 == nil { + templ_7745c5c3_Var187 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var188 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + if blog != nil { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 178, "<a href=\"") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var189 templ.SafeURL + templ_7745c5c3_Var189, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("/blogs/" + blog.Slug)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 773, Col: 49} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var189)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 179, "\">vim ~/blogs/") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var190 string + templ_7745c5c3_Var190, templ_7745c5c3_Err = templ.JoinStringErrs(blog.Slug) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `website.templ`, Line: 773, Col: 75} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var190)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 180, "</a>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + return nil + }) + templ_7745c5c3_Err = TerminalBorder(label, "", extra).Render(templ.WithChildren(ctx, templ_7745c5c3_Var188), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func FootnotePanel() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var191 := templ.GetChildren(ctx) + if templ_7745c5c3_Var191 == nil { + templ_7745c5c3_Var191 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 181, "<aside data-footnote-panel class=\"hidden fixed left-[calc(50%+38.5rem)] top-[calc(50%-20rem)] w-[10.5rem] max-h-[40rem] overflow-y-auto\">") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Var192 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 182, "<div data-footnote-body class=\"font-(family-name:--font-normal)\"></div>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = TerminalBorder("note", "", "text-[14px]").Render(templ.WithChildren(ctx, templ_7745c5c3_Var192), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 183, "</aside>") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + var _ = templruntime.GeneratedTemplate |
