This commit is contained in:
2026-03-21 14:53:25 +00:00
commit 17f2462baf
42 changed files with 5986 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "content"]
path = content
url = https://git.voidarc.co.uk/voidarc/blog.norg

181
assets/norgolith.svg Normal file
View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1280"
height="1280"
viewBox="0 0 338.66667 338.66666"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="norgolith.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="0.51213161"
inkscape:cx="530.13717"
inkscape:cy="504.75307"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showgrid="false" /><defs
id="defs1"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect15"
is_visible="true"
lpeversion="1"
nodesatellites_param=""
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="swatch10"
inkscape:swatch="solid"><stop
style="stop-color:#32b6be;stop-opacity:1;"
offset="0"
id="stop13" /></linearGradient><linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="205.27161"
y1="136.063"
x2="800.72571"
y2="855.02252"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#33AAE6"
id="stop1" />
<stop
offset="0.9915"
style="stop-color:#4B3892"
id="stop2" />
</linearGradient><linearGradient
id="SVGID_2_"
gradientUnits="userSpaceOnUse"
x1="531.92999"
y1="357.42569"
x2="693.40002"
y2="357.42569"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#3D85C9"
id="stop3" />
<stop
offset="1"
style="stop-color:#4A4198"
id="stop4" />
</linearGradient><linearGradient
id="SVGID_3_"
gradientUnits="userSpaceOnUse"
x1="531.91998"
y1="288.905"
x2="944.48761"
y2="288.905"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#61C67C"
id="stop5" />
<stop
offset="1"
style="stop-color:#366794"
id="stop6" />
</linearGradient><linearGradient
id="SVGID_4_"
gradientUnits="userSpaceOnUse"
x1="843.47998"
y1="404.53009"
x2="969.75562"
y2="404.53009"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#2F6B7F"
id="stop7" />
<stop
offset="1"
style="stop-color:#325D87"
id="stop8" />
</linearGradient><linearGradient
id="SVGID_5_"
gradientUnits="userSpaceOnUse"
x1="513.32288"
y1="718.00439"
x2="900.78381"
y2="143.70779"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#3B7FC4"
id="stop9" />
<stop
offset="0.4665"
style="stop-color:#90B1DF"
id="stop10" />
<stop
offset="0.764"
style="stop-color:#7381C0"
id="stop11" />
<stop
offset="1"
style="stop-color:#5F5FAB"
id="stop12" />
</linearGradient></defs><g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g17"
transform="matrix(0.95818663,0,0,0.95818663,7.080397,7.080397)"><g
id="g1"
transform="matrix(1.189346,0,0,1.189346,10.198838,10.198838)"
style="fill:#425dae;fill-opacity:1"><path
fill="#000000"
d="M 219.6,48.1 C 196.7,25.2 166.2,12.6 133.8,12.6 101.4,12.6 71,25.2 48.1,48.1 25.2,71 12.6,101.5 12.6,133.9 c 0,32.4 12.6,62.9 35.5,85.8 22.9,22.9 53.4,35.5 85.8,35.5 32.4,0 62.9,-12.6 85.8,-35.5 22.9,-22.9 35.5,-53.4 35.5,-85.8 0,-32.4 -12.7,-62.9 -35.6,-85.8 z"
id="path1"
style="fill:#425dae;fill-opacity:1" /><path
fill="#000000"
d="M 133.8,0 C 59.9,0 0,59.9 0,133.8 c 0,73.9 59.9,133.8 133.8,133.8 73.9,0 133.8,-59.9 133.8,-133.8 C 267.6,59.9 207.8,0 133.8,0 Z m 0,260.1 C 64.1,260.1 7.5,203.6 7.5,133.8 7.5,64 64.1,7.6 133.8,7.6 c 69.7,0 126.3,56.5 126.3,126.3 0,69.8 -56.5,126.2 -126.3,126.2 z"
id="path2"
style="fill:#425dae;fill-opacity:1" /></g><g
id="g2"
transform="matrix(2.4193807,0,0,2.4193807,48.359493,48.359967)"
style="fill:#e6e6e6;fill-opacity:1"><g
id="g16"><path
d="m 46.355,96.716162 a 5.14,4.3759472 0 0 0 3.644,1.283839 5.14,4.3759472 0 0 0 3.645,-1.283839 l 23.129,-19.69091 a 5.127,4.3648797 0 0 0 1.512,-3.102325 v -6.967463 a 5.138,4.3742445 0 0 0 -3.184,-4.054136 5.144,4.3793526 0 0 0 -5.617,0.950961 L 50.816,79.741915 a 1.147,0.97650029 0 0 1 -1.633,0 L 30.52,63.822491 c -1.48,-1.260001 -3.684,-1.635447 -5.617,-0.953514 -1.933,0.681933 -3.184,2.270555 -3.184,4.053285 v 7.00407 a 5.1,4.3418931 0 0 0 1.512,3.102325 z"
id="path1-4"
style="fill:#e6e6e6;fill-opacity:1;stroke-width:0.922688" /><path
d="M 46.355,2.7570265 33.742,16.125 c -0.965217,0.967485 -1.508728,2.277377 -1.512,3.644 v 31.027 c 0,1.38 0.535,2.672 1.512,3.645 l 12.613,12.617 c 0.966006,0.966822 2.280272,2.415079 3.646986,2.412968 1.36706,0.0024 2.675764,-1.4459 3.642014,-2.412968 L 66.257,54.44 c 0.970123,-0.96461 1.514494,-2.276934 1.512,-3.645 V 19.77 C 67.7651,18.403508 67.221664,17.093854 66.257,16.126 L 53.644,2.7530265 c -2.016047,-2.00746088 -5.276158,-2.00567208 -7.29,0.004 z"
id="path2-2"
style="fill:#e6e6e6;fill-opacity:1"
sodipodi:nodetypes="cccsccccccccccc" /></g></g></g></g><style
type="text/css"
id="style1">
.st0{fill:none;}
.st1{fill:url(#SVGID_1_);}
.st2{fill:url(#SVGID_2_);}
.st3{fill:url(#SVGID_3_);}
.st4{fill:url(#SVGID_4_);}
.st5{fill:url(#SVGID_5_);}
</style></svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

110
assets/style.css Normal file
View File

@@ -0,0 +1,110 @@
/* Default fonts */
@font-face {
font-family: "Inter";
font-style: normal;
font-display: swap;
font-weight: 100 900;
src: url(https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2) format('woff2-variations');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
font-family: "JetBrains Mono";
font-style: normal;
font-display: swap;
font-weight: 100 800;
src: url(https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono:vf@latest/latin-wght-normal.woff2) format('woff2-variations');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
font-family: "JetBrains Mono Italic";
font-style: italic;
font-display: swap;
font-weight: 100 800;
src: url(https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono:vf@latest/latin-wght-italic.woff2) format('woff2-variations');
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
/* Styling */
*, *:before, *:after {
box-sizing: border-box;
}
body {
color: white;
background-color: #202030;
width: auto;
height: 100%;
font-family: "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
/* Inline verbatim `` */
code {
font-family: "JetBrains Mono", monospace;
background-color: #303040;
border-radius: 6px;
padding: 0px 4px;
}
/* PrismJS specific css */
pre[class*="language-"],
code[class*="language-"] {
text-shadow: unset !important;
font-family: "JetBrains Mono", monospace !important;
}
/* PrismJS line-numbers plugin */
pre[class*="language-"].line-numbers {
position: relative;
padding-left: 3.4em;
counter-reset: linenumber;
}
pre[class*="language-"].line-numbers > code {
position: relative;
white-space: inherit;
}
.line-numbers .line-numbers-rows {
position: absolute;
pointer-events: none;
top: 0;
font-size: 100%;
left: -3.8em;
width: 3em; /* works for line-numbers below 1000 lines */
/* letter-spacing: -1px; */
border-right: 1px solid #999;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.line-numbers-rows > span {
display: block;
counter-increment: linenumber;
}
.line-numbers-rows > span:before {
content: counter(linenumber);
color: #999;
display: block;
padding-right: 0.8em;
text-align: right;
}
/* Norgolith landing page styling */
#desc > a,
#discord-link > a,
#github-pages > a,
#github-issues > a {
color: var(--color-blue-400);
}
#desc > a:hover,
#discord-link > a:hover,
#github-pages > a:hover,
#github-issues > a:hover {
text-decoration: underline;
}

1
content Submodule

Submodule content added at 9c423da166

30
norgolith.toml Normal file
View File

@@ -0,0 +1,30 @@
rootUrl = 'https://blog.voidarc.co.uk'
language = 'en-US'
title = 'voidarc'
author = 'user01'
# Code blocks highlighting
[highlighter]
enable = false
# engine = 'prism' # Can be 'prism' or 'hljs'. Defaults to 'prism'
# RSS feed
[rss]
enable = true
description = 'Latest posts'
ttl = 60
image = '/assets/favicon.png'
[extra]
license = "MIT" # Optional
favicon_path = "/assets/norgolith.svg" # Fallback to default favicon
footer_author_link = "https://git.voidarc.co.uk/voidarc" # Optional
enable_mermaid = true # Enable Mermaid.js for diagrams
[extra.nav]
blog = "/posts"
Git = "https://git.voidarc.co.uk"
[extra.footer]
Link_name = "url"
GitHub = "https://git.voidarc.co.uk/voidarc"

View File

@@ -0,0 +1 @@
pre[class*=language-]{--padding-y:var(--am-prism-padding-y, 1rem);--padding-x:var(--am-prism-padding-x, 1rem);padding:var(--padding-y) var(--padding-x);overflow:auto;font-size:var(--am-prism-font-size,.85em);border-radius:var(--am-prism-border-radius,.4em)}pre>code[class*=language-]{padding:initial;font-size:1em;font-weight:400;font-family:var(--am-prism-font-family,ui-monospace),monospace;line-height:var(--am-prism-line-height,1.5);background-color:initial}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-] .line-numbers-rows{box-sizing:content-box;margin:calc(var(--padding-y) * -1) 0;padding:var(--padding-y) 0}.line-numbers.line-numbers .line-numbers-rows{border-right-width:var(--am-prism-border-width,1px);border-right-color:var(--am-prism-border-color)}.line-numbers .line-numbers-rows>span:before{color:var(--am-prism-line-numbers-color)}div.code-toolbar>.toolbar{top:.3rem!important;right:.3rem!important}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button{display:inline-flex;padding:0 .75em;font-size:var(--am-prism-font-size,.8em);font-family:var(--am-prism-font-family,ui-monospace),monospace;font-weight:600!important;line-height:2.25em;color:var(--am-prism-copy-color);background-color:var(--am-prism-copy-bg);border-radius:calc(var(--am-prism-border-radius, .4em) - .1em);cursor:pointer;box-shadow:none;opacity:1;transition:opacity .2s}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button:hover{opacity:.8}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button:focus{opacity:1}code[class*=language-],pre[class*=language-]{color:#202023}pre[class*=language-]{background:#bbbbce}:not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#202023;background:#bbbbce}pre[data-line]{position:relative}pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#fff8c5;box-shadow:inset 5px 0 0 #eed888;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}.namespace{opacity:.7}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8989a9}.token.operator,.token.punctuation{color:#0c5090}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.class-name,.token.symbol,.token.tag{color:#ae580e}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#287f0d}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#287f0d}.token.atrule,.token.attr-value,.token.keyword{color:#0c5090}.token.function{color:#a00c79}.token.macro,.token.important,.token.regex,.token.variable{color:#9437ff}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--am-prism-line-numbers-color:#18181a77;--am-prism-border-color:#18181a22;--am-prism-copy-color:#202023aa;--am-prism-copy-bg:#78789d22}html[class*="-dark"],html[class*="dark-"],.dark{& code[class*=language-],& pre[class*=language-]{color:#d3d7de}& pre[class*=language-]{background:#303040}& :not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#bdbdbd;background:#303040}& pre[data-line]{position:relative}& pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}& .line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#2f2a1e;box-shadow:inset 5px 0 0 #674c16;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}& .namespace{opacity:.7}& .token.cdata,& .token.comment,& .token.doctype,& .token.prolog{color:#798399}& .token.punctuation,& .token.operator,& .token.variable{color:#73a3f3}& .token.boolean,& .token.constant,& .token.deleted,& .token.number,& .token.property,& .token.symbol,& .token.class-name,& .token.tag{color:#e7a06a}& .token.attr-name,& .token.builtin,& .token.char,& .token.inserted,& .token.selector,& .token.string{color:#89c252}& .language-css .token.string,& .style .token.string,& .token.entity,& .token.url{color:#89c252;background:#161b22}& .token.atrule,& .token.keyword{color:#73a3f3}& .token.attr-value,& .token.function{color:#d087e8}& .token.macro,& .token.important,& .token.regex{color:#b094e2}& .token.bold,& .token.important{font-weight:700}& .token.italic{font-style:italic}& .token.entity{cursor:help}&{--am-prism-line-numbers-color:#bdbdbd55;--am-prism-border-color:#bdbdbd22;--am-prism-copy-color:#d3d7de;--am-prism-copy-bg:#707b8722}}

1372
public/assets/css/styles.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

181
public/assets/norgolith.svg Normal file
View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1280"
height="1280"
viewBox="0 0 338.66667 338.66666"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="norgolith.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="0.51213161"
inkscape:cx="530.13717"
inkscape:cy="504.75307"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showgrid="false" /><defs
id="defs1"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect15"
is_visible="true"
lpeversion="1"
nodesatellites_param=""
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="swatch10"
inkscape:swatch="solid"><stop
style="stop-color:#32b6be;stop-opacity:1;"
offset="0"
id="stop13" /></linearGradient><linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="205.27161"
y1="136.063"
x2="800.72571"
y2="855.02252"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#33AAE6"
id="stop1" />
<stop
offset="0.9915"
style="stop-color:#4B3892"
id="stop2" />
</linearGradient><linearGradient
id="SVGID_2_"
gradientUnits="userSpaceOnUse"
x1="531.92999"
y1="357.42569"
x2="693.40002"
y2="357.42569"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#3D85C9"
id="stop3" />
<stop
offset="1"
style="stop-color:#4A4198"
id="stop4" />
</linearGradient><linearGradient
id="SVGID_3_"
gradientUnits="userSpaceOnUse"
x1="531.91998"
y1="288.905"
x2="944.48761"
y2="288.905"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#61C67C"
id="stop5" />
<stop
offset="1"
style="stop-color:#366794"
id="stop6" />
</linearGradient><linearGradient
id="SVGID_4_"
gradientUnits="userSpaceOnUse"
x1="843.47998"
y1="404.53009"
x2="969.75562"
y2="404.53009"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#2F6B7F"
id="stop7" />
<stop
offset="1"
style="stop-color:#325D87"
id="stop8" />
</linearGradient><linearGradient
id="SVGID_5_"
gradientUnits="userSpaceOnUse"
x1="513.32288"
y1="718.00439"
x2="900.78381"
y2="143.70779"
gradientTransform="matrix(1,0,0,-1,0,1024)">
<stop
offset="0"
style="stop-color:#3B7FC4"
id="stop9" />
<stop
offset="0.4665"
style="stop-color:#90B1DF"
id="stop10" />
<stop
offset="0.764"
style="stop-color:#7381C0"
id="stop11" />
<stop
offset="1"
style="stop-color:#5F5FAB"
id="stop12" />
</linearGradient></defs><g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g17"
transform="matrix(0.95818663,0,0,0.95818663,7.080397,7.080397)"><g
id="g1"
transform="matrix(1.189346,0,0,1.189346,10.198838,10.198838)"
style="fill:#425dae;fill-opacity:1"><path
fill="#000000"
d="M 219.6,48.1 C 196.7,25.2 166.2,12.6 133.8,12.6 101.4,12.6 71,25.2 48.1,48.1 25.2,71 12.6,101.5 12.6,133.9 c 0,32.4 12.6,62.9 35.5,85.8 22.9,22.9 53.4,35.5 85.8,35.5 32.4,0 62.9,-12.6 85.8,-35.5 22.9,-22.9 35.5,-53.4 35.5,-85.8 0,-32.4 -12.7,-62.9 -35.6,-85.8 z"
id="path1"
style="fill:#425dae;fill-opacity:1" /><path
fill="#000000"
d="M 133.8,0 C 59.9,0 0,59.9 0,133.8 c 0,73.9 59.9,133.8 133.8,133.8 73.9,0 133.8,-59.9 133.8,-133.8 C 267.6,59.9 207.8,0 133.8,0 Z m 0,260.1 C 64.1,260.1 7.5,203.6 7.5,133.8 7.5,64 64.1,7.6 133.8,7.6 c 69.7,0 126.3,56.5 126.3,126.3 0,69.8 -56.5,126.2 -126.3,126.2 z"
id="path2"
style="fill:#425dae;fill-opacity:1" /></g><g
id="g2"
transform="matrix(2.4193807,0,0,2.4193807,48.359493,48.359967)"
style="fill:#e6e6e6;fill-opacity:1"><g
id="g16"><path
d="m 46.355,96.716162 a 5.14,4.3759472 0 0 0 3.644,1.283839 5.14,4.3759472 0 0 0 3.645,-1.283839 l 23.129,-19.69091 a 5.127,4.3648797 0 0 0 1.512,-3.102325 v -6.967463 a 5.138,4.3742445 0 0 0 -3.184,-4.054136 5.144,4.3793526 0 0 0 -5.617,0.950961 L 50.816,79.741915 a 1.147,0.97650029 0 0 1 -1.633,0 L 30.52,63.822491 c -1.48,-1.260001 -3.684,-1.635447 -5.617,-0.953514 -1.933,0.681933 -3.184,2.270555 -3.184,4.053285 v 7.00407 a 5.1,4.3418931 0 0 0 1.512,3.102325 z"
id="path1-4"
style="fill:#e6e6e6;fill-opacity:1;stroke-width:0.922688" /><path
d="M 46.355,2.7570265 33.742,16.125 c -0.965217,0.967485 -1.508728,2.277377 -1.512,3.644 v 31.027 c 0,1.38 0.535,2.672 1.512,3.645 l 12.613,12.617 c 0.966006,0.966822 2.280272,2.415079 3.646986,2.412968 1.36706,0.0024 2.675764,-1.4459 3.642014,-2.412968 L 66.257,54.44 c 0.970123,-0.96461 1.514494,-2.276934 1.512,-3.645 V 19.77 C 67.7651,18.403508 67.221664,17.093854 66.257,16.126 L 53.644,2.7530265 c -2.016047,-2.00746088 -5.276158,-2.00567208 -7.29,0.004 z"
id="path2-2"
style="fill:#e6e6e6;fill-opacity:1"
sodipodi:nodetypes="cccsccccccccccc" /></g></g></g></g><style
type="text/css"
id="style1">
.st0{fill:none;}
.st1{fill:url(#SVGID_1_);}
.st2{fill:url(#SVGID_2_);}
.st3{fill:url(#SVGID_3_);}
.st4{fill:url(#SVGID_4_);}
.st5{fill:url(#SVGID_5_);}
</style></svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

1
public/assets/style.css Normal file
View File

@@ -0,0 +1 @@
@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:100 900;src:url(https://cdn.jsdelivr.net/fontsource/fonts/inter:vf@latest/latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:100 800;src:url(https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono:vf@latest/latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Italic;font-style:italic;font-display:swap;font-weight:100 800;src:url(https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono:vf@latest/latin-wght-italic.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after{box-sizing:border-box}body{color:#fff;background-color:#202030;width:auto;height:100%;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}code{background-color:#303040;border-radius:6px;padding:0 4px;font-family:JetBrains Mono,monospace}pre[class*=language-],code[class*=language-]{text-shadow:unset!important;font-family:JetBrains Mono,monospace!important}pre[class*=language-].line-numbers{counter-reset:linenumber;padding-left:3.4em;position:relative}pre[class*=language-].line-numbers>code{white-space:inherit;position:relative}.line-numbers .line-numbers-rows{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-right:1px solid #999;width:3em;font-size:100%;position:absolute;top:0;left:-3.8em}.line-numbers-rows>span{counter-increment:linenumber;display:block}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;text-align:right;padding-right:.8em;display:block}#desc>a,#discord-link>a,#github-pages>a,#github-issues>a{color:var(--color-blue-400)}#desc>a:hover,#discord-link>a:hover,#github-pages>a:hover,#github-issues>a:hover{text-decoration:underline}

View File

@@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Category: blog - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/blog" />
<meta property="og:description" content="Posts on category blog" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/blog" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Category: blog - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Posts in blog</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "blog"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,278 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Categories - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories" />
<meta property="og:description" content="Posts categories" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Categories - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Categories</h1>
<p class="text-sm text-text/70"><i>All the categories used in posts.</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/blog">blog</a>
<span class="text-grey">(0 posts)</span>
</li>
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/neorg">neorg</a>
<span class="text-grey">(0 posts)</span>
</li>
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/nvim">nvim</a>
<span class="text-grey">(0 posts)</span>
</li>
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/voidarc">voidarc</a>
<span class="text-grey">(0 posts)</span>
</li>
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/webdev">webdev</a>
<span class="text-grey">(0 posts)</span>
</li>
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Category: neorg - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/neorg" />
<meta property="og:description" content="Posts on category neorg" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/neorg" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Category: neorg - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Posts in neorg</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "neorg"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Category: nvim - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/nvim" />
<meta property="og:description" content="Posts on category nvim" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/nvim" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Category: nvim - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Posts in nvim</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "nvim"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Category: voidarc - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/voidarc" />
<meta property="og:description" content="Posts on category voidarc" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/voidarc" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Category: voidarc - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Posts in voidarc</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "voidarc"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,243 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
<meta property="og:title" content="Category: webdev - Voidarc" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/webdev" />
<meta property="og:description" content="Posts on category webdev" />
<meta property="og:site_name" content="voidarc" />
<meta property="og:locale" content="en-US" />
<link rel="canonical" href="https:&#x2F;&#x2F;blog.voidarc.co.uk/categories/webdev" />
<meta name="robots" content="index, follow" />
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css" />
<link rel="icon" href=&#x2F;assets&#x2F;norgolith.svg />
<title>Category: webdev - Voidarc</title>
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="https:&#x2F;&#x2F;blog.voidarc.co.uk/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">Voidarc</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
<a
:class="{ 'text-magenta!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-magenta!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
<a
:class="{ 'text-blue!': currentPage.startsWith('&#x2F;posts') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="&#x2F;posts"
>Blog</a>
<a
:class="{ 'text-blue!': currentPage.startsWith('https:&#x2F;&#x2F;git.voidarc.co.uk') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="https:&#x2F;&#x2F;git.voidarc.co.uk"
>Git</a>
</div>
</div>
</nav>
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
<div>
<h1>Posts in webdev</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "webdev"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
</ul>
</div>
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; 2026
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="text-blue hover:underline">user01</a
>.
<br class="md:hidden" /> Licensed under MIT.
</span>
<div class="flex flex-inline">
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="url"
class="hover:text-blue"
>
<span>Link_name</span>
</a>
</div>
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="https:&#x2F;&#x2F;git.voidarc.co.uk&#x2F;voidarc"
class="hover:text-blue"
>
<span>Github</span>
</a>
</div>
</div>
</div>
</footer>
</div>
</body>
</html>

1
public/index.html Normal file

File diff suppressed because one or more lines are too long

1
public/posts/index.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

33
public/rss.xml Normal file
View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>voidarc</title>
<link>https://blog.voidarc.co.uk</link>
<description>Latest posts</description>
<generator>Norgolith</generator>
<language>en-US</language>
<lastBuildDate>Sat, 21 Mar 2026 14:39:49 +0000</lastBuildDate>
<ttl>60</ttl>
<atom:link href="https:&#x2F;&#x2F;blog.voidarc.co.uk/rss.xml" rel="self" type="application/rss+xml" />
<image>
<url>https://blog.voidarc.co.uk&#x2F;assets&#x2F;favicon.png</url>
<title>voidarc</title>
<link>https://blog.voidarc.co.uk</link>
<width>144</width>
<height>144</height>
</image>
<item>
<title>Making a Blog Using a Niche Markdown Language</title>
<link>https://blog.voidarc.co.uk/posts/site/</link>
<guid>https://blog.voidarc.co.uk/posts/site/</guid>
<description>How to make a blog using Norg and some random project from github</description>
<author>Adumh00man</author>
<pubDate>Sat, 21 Mar 2026 11:39:17 +0000</pubDate>
<category>Blog</category><category>Neorg</category><category>Nvim</category><category>Voidarc</category><category>Webdev</category>
</item>
</channel>
</rss>

62
templates/base.html Normal file
View File

@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="{{ config.language }}">
<head>
{% block head %}
<meta charset="UTF-8" />
{% if metadata.description and not metadata.description == "nil" %}
<meta name="description" content="{{ metadata.description }}" />
{% endif %}
{% if metadata.authors %}
<meta name="author" content="{{ config.author }}" />
{% endif %}
{% if metadata.categories %}
<meta name="keywords" content="{{ metadata.categories | join(sep=", ") }}" />
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% if config.highlighter is defined and config.highlighter.enable %}
{# If highlighter is enabled but the engine is not defined then fallback to prismjs #}
{% if config.highlighter.engine is not string or config.highlighter.engine == "prism" %}
{# PrismJS #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism-themes/1.9.0/prism-one-dark.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
{% elif config.highlighter.engine is defined
and config.highlighter.engine == "hljs" %}
{# Highlight.js #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script> #}
{# Enable this one instead if you want all the `<code>` tags to be highlighted
<script>
document.addEventListener("DOMContentLoaded", (event) => {
document.querySelectorAll("code").forEach((block) => {
hljs.highlightBlock(block);
});
});
</script>
#}
{% elif config.highlighter.engine is string
and config.highlighter.engine not in ["prism", "hljs"] %}
<script>
window.alert("Warning: highlighter is enabled in the site configuration but its engine is not 'prism' nor 'hljs'");
</script>
{% endif %}
{% endif %}
{# User-defined styling #}
{# Tailwind CDN, replace with the Tailwind standalone CLI for production! #}
<script src="https://unpkg.com/@tailwindcss/browser@4"></script>
<link rel="stylesheet" href="/assets/style.css" />
<link rel="icon" href="/assets/norgolith.svg" />
<title>{% block title %}{% endblock title %} - {{ config.title | title }}</title>
{% endblock head %}
</head>
<body>
<div id="content">{% block content %}{% endblock content %}</div>
<div id="footer">
{% block footer %}
&copy; Copyright {{ now(format="%Y") }} by {{ config.author }}.
{% endblock footer %}
</div>
</body>
</html>

23
templates/categories.html Normal file
View File

@@ -0,0 +1,23 @@
{% extends "base.html" %}
{% block title %}Categories{% endblock title %}
{% block content %}
<div>
<h1>Categories</h1>
<p><i>All the categories used in posts.</i></p>
<hr />
<ul>
{% for category in categories | sort %}
{%- set_global cat_posts = 0 -%}
{% for post in posts %}
{% if category in post.categories %}
{%- set_global cat_posts = cat_posts + 1 -%}
{% endif %}
{% endfor %}
<li>
<a href="{{ config.rootUrl }}/categories/{{ category }}">{{ category }}</a>
<span>({{ cat_posts }} post{{ cat_posts | pluralize }})</span>
</li>
{% endfor %}
</ul>
</div>
{% endblock content %}

19
templates/category.html Normal file
View File

@@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block title %}Category: {{ category }}{% endblock title %}
{% block content %}
<div>
<h1>Posts in {{ category }}</h1>
<p><i>All the posts with the category "{{ category }}"</i></p>
<hr />
<ul>
{% for post in posts %}
{% if category in post.categories %}
<li>
<a href="{{ post.permalink }}">{{ post.title }}</a>
<time>{{ post.created | date(format="%B %e, %Y") }}</time>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endblock content %}

28
templates/default.html Normal file
View File

@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block title %}{{ metadata.title | title }}{% endblock title %}
{% block content %}
<div class="container mx-auto min-h-screen mt-12">
{{ content | safe }}
</div>
{% endblock content %}
{% block footer %}
<footer class="bg-[#303040] mt-12 py-4 px-6 w-full font-mono">
<div
class="flex justify-between items-center font-medium text-xs md:text-sm text-grey"
>
<span
>Copyright &copy; {{ now(format="%Y") }}
<a
href="https://github.com/NTBBloodbath"
class="text-blue-400 hover:underline">NTBBloodbath</a
>. Licensed under GPLv2.</span
>
<a
href="https://github.com/NTBBloodbath/norgolith"
class="hover:text-blue-400"
>
<span>GitHub</span>
</a>
</div>
</footer>
{% endblock footer %}

33
templates/rss.xml Normal file
View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ config.title }}</title>
<link>{{ config.rootUrl | escape_xml | safe }}</link>
<description>{{ config.rss.description | default(value="Latest posts")}}</description>
<generator>Norgolith</generator>
<language>{{ config.language }}</language>
<lastBuildDate>{{ now | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
<ttl>{{ config.rss.ttl | default(value=60) }}</ttl>
<atom:link href="{{ config.rootUrl }}/rss.xml" rel="self" type="application/rss+xml" />
<image>
<url>{{ config.rootUrl | escape_xml | safe }}{{ config.rss.image | default(value="/assets/favicon.png") }}</url>
<title>{{ config.title }}</title>
<link>{{ config.rootUrl | escape_xml | safe }}</link>
<width>144</width>
<height>144</height>
</image>
{% for post in posts | filter(attribute="draft", value=false) %}
<item>
<title>{{ post.title }}</title>
<link>{{ post.permalink | escape_xml | safe }}</link>
<guid>{{ post.permalink | escape_xml | safe }}</guid>
<description>{{ post.description }}</description>
<author>{{ post.authors | join(sep=", ") }}</author>
<pubDate>{{ post.created | date(format="%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
{% if post.categories %}{% for category in post.categories %}<category>{{ category }}</category>{% endfor %}{% endif %}
</item>
{% endfor %}
</channel>
</rss>

3
theme/.metadata.toml Normal file
View File

@@ -0,0 +1,3 @@
repo = "github:NTBBloodbath/norgowind"
version = "0.6.0"
pin = false

21
theme/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 NTBBloodbath <bloodbathalchemist@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

143
theme/README.md Normal file
View File

@@ -0,0 +1,143 @@
# Norgowind
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)
![Version](https://img.shields.io/badge/version-0.4.1-blue)
A modern, responsive theme for the [Norgolith SSG](https://github.com/NTBBloodbath/norgolith), built with TailwindCSS. Norgowind provides a clean, customizable look for your Norgolith-powered site, with extra features and easy configuration.
---
## Features
- Beautiful, responsive minimal design powered by TailwindCSS
- Ready-to-use templates for posts, categories, home, and more
- Customizable navigation and footer links
- Built-in icons support thanks to tabler icons library
- Mermaid.js support for diagrams and charts
- Additional blockquote styles (tip, note, important, warning, error)
- Truncation options for post cards
## Demo
See Norgowind in action:
- [amartin.beer](https://amartin.beer)
- [Official Norgolith documentation](https://norgolith.amartin.beer)
### Showcase
<details>
<summary>Home page</summary>
<img width="1904" height="1212" alt="image" src="https://github.com/user-attachments/assets/c66ac751-cb0a-4cd5-bc8c-bf10b6414997" />
</details>
<details>
<summary>Post view</summary>
<img width="1904" height="1064" alt="image" src="https://github.com/user-attachments/assets/77a47b5c-b9d3-409e-a022-5493f049b968" />
</details>
## Requirements
- [Norgolith](https://github.com/NTBBloodbath/norgolith) (latest commit on `master` branch required)
- [TailwindCSS CLI](https://tailwindcss.com/docs/installation) (for development or custom styling)
## Installation
```bash
lith theme pull github:NTBBloodbath/norgowind
```
> [!IMPORTANT]
>
> Norgowind requires the latest Norgolith commit in the master branch in order to work.
## Usage
After installing, configure your site as described below. If you plan to modify the CSS, see the [Tailwind Reloading](#tailwind-reloading) section.
### Configuration
Add the following fields to your `norgolith.toml`:
```toml
[extra]
license = "GPLv2" # Optional
favicon_path = "/assets/norgolith.svg" # Fallback to default favicon
footer_author_link = "https://github.com/NTBBloodbath" # Optional
enable_mermaid = true # Enable Mermaid.js for diagrams
[extra.nav]
# Link_name = "url"
# blog = "/posts"
# GitHub = "https://github.com/NTBBloodbath/norgolith"
[extra.footer]
# Link_name = "url"
# GitHub = "https://github.com/NTBBloodbath/norgolith"
```
### Templates
Norgowind provides these templates:
```
templates
├── partials
│ ├── footer.html <- Footer content
│ └── nav.html <- Header navbar
├── base.html <- Main template (extends others)
├── categories.html <- Categories list
├── category.html <- Category posts list
├── default.html <- Default template for all content
├── home.html <- Homepage
├── post.html <- Blog post
└── posts.html <- Posts list
```
To use a template, set the `layout` metadata in your content files. For example, in a blog post:
```norg
layout: post
```
> [!TIP]
>
> Norgolith expects your blog posts in the `content/posts` directory.
### MermaidJS Support
Norgowind comes with opt-in support for MermaidJS flowcharts. You can use mermaid charts through embedded HTML in your norg content if you set the `enable_mermaid` option to `true` in the `extra` table of your configuration file:
```org
@embed html
<pre class="mermaid">
flowchart LR
A[HTML Fragment] --> B[Tera Engine]
C[Validated Metadata] --> B
D[Site Config] --> B
E[Post Collection] --> B
B --> F[Layout Template]
F --> G[Final HTML]
</pre>
@end
```
### Additional Styling
Norgowind adds extra blockquote classes (use with `+html.class` tags):
- `tip` (green)
- `note` (blue)
- `important` (violet)
- `warning` (yellow)
- `error` (red)
![blockquotes.png](https://github.com/user-attachments/assets/d45e2e97-5e3b-43cb-8077-a16f737259b9)
### Additional Metadata Fields
- `truncate`: Set the truncate character length for recent post cards.
- `truncate_char`: Set the truncate character (default is ellipsis). Leave empty to disable.
### Tailwind Reloading
By default, Tailwind's configuration in Norgowind watches content files and templates. Each new class added to content using a `+html.class` tag will be included in the styling file.
For site development, install the TailwindCSS CLI and run:
```sh
tailwindcss -i theme/assets/css/tailwind.css -o theme/assets/css/styles.min.css --minify --watch
```
## Contributing
Contributions, issues, and feature requests are welcome! Feel free to open an issue or pull request.
## License
Norgowind is licensed under the MIT License.

View File

@@ -0,0 +1 @@
pre[class*=language-]{--padding-y:var(--am-prism-padding-y, 1rem);--padding-x:var(--am-prism-padding-x, 1rem);padding:var(--padding-y) var(--padding-x);overflow:auto;font-size:var(--am-prism-font-size,.85em);border-radius:var(--am-prism-border-radius,.4em)}pre>code[class*=language-]{padding:initial;font-size:1em;font-weight:400;font-family:var(--am-prism-font-family,ui-monospace),monospace;line-height:var(--am-prism-line-height,1.5);background-color:initial}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-] .line-numbers-rows{box-sizing:content-box;margin:calc(var(--padding-y) * -1) 0;padding:var(--padding-y) 0}.line-numbers.line-numbers .line-numbers-rows{border-right-width:var(--am-prism-border-width,1px);border-right-color:var(--am-prism-border-color)}.line-numbers .line-numbers-rows>span:before{color:var(--am-prism-line-numbers-color)}div.code-toolbar>.toolbar{top:.3rem!important;right:.3rem!important}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button{display:inline-flex;padding:0 .75em;font-size:var(--am-prism-font-size,.8em);font-family:var(--am-prism-font-family,ui-monospace),monospace;font-weight:600!important;line-height:2.25em;color:var(--am-prism-copy-color);background-color:var(--am-prism-copy-bg);border-radius:calc(var(--am-prism-border-radius, .4em) - .1em);cursor:pointer;box-shadow:none;opacity:1;transition:opacity .2s}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button:hover{opacity:.8}div.code-toolbar>.toolbar>.toolbar-item>button.copy-to-clipboard-button:focus{opacity:1}code[class*=language-],pre[class*=language-]{color:#202023}pre[class*=language-]{background:#bbbbce}:not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#202023;background:#bbbbce}pre[data-line]{position:relative}pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#fff8c5;box-shadow:inset 5px 0 0 #eed888;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}.namespace{opacity:.7}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8989a9}.token.operator,.token.punctuation{color:#0c5090}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.class-name,.token.symbol,.token.tag{color:#ae580e}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#287f0d}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#287f0d}.token.atrule,.token.attr-value,.token.keyword{color:#0c5090}.token.function{color:#a00c79}.token.macro,.token.important,.token.regex,.token.variable{color:#9437ff}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--am-prism-line-numbers-color:#18181a77;--am-prism-border-color:#18181a22;--am-prism-copy-color:#202023aa;--am-prism-copy-bg:#78789d22}html[class*="-dark"],html[class*="dark-"],.dark{& code[class*=language-],& pre[class*=language-]{color:#d3d7de}& pre[class*=language-]{background:#303040}& :not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#bdbdbd;background:#303040}& pre[data-line]{position:relative}& pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}& .line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:#2f2a1e;box-shadow:inset 5px 0 0 #674c16;z-index:0;pointer-events:none;line-height:inherit;white-space:pre}& .namespace{opacity:.7}& .token.cdata,& .token.comment,& .token.doctype,& .token.prolog{color:#798399}& .token.punctuation,& .token.operator,& .token.variable{color:#73a3f3}& .token.boolean,& .token.constant,& .token.deleted,& .token.number,& .token.property,& .token.symbol,& .token.class-name,& .token.tag{color:#e7a06a}& .token.attr-name,& .token.builtin,& .token.char,& .token.inserted,& .token.selector,& .token.string{color:#89c252}& .language-css .token.string,& .style .token.string,& .token.entity,& .token.url{color:#89c252;background:#161b22}& .token.atrule,& .token.keyword{color:#73a3f3}& .token.attr-value,& .token.function{color:#d087e8}& .token.macro,& .token.important,& .token.regex{color:#b094e2}& .token.bold,& .token.important{font-weight:700}& .token.italic{font-style:italic}& .token.entity{cursor:help}&{--am-prism-line-numbers-color:#bdbdbd55;--am-prism-border-color:#bdbdbd22;--am-prism-copy-color:#d3d7de;--am-prism-copy-bg:#707b8722}}

1372
theme/assets/css/styles.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,343 @@
@import url("https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&display=swap");
@import url("https://unpkg.com/@catppuccin/palette/css/catppuccin.css");
@import "tailwindcss";
/* User content */
@source "../../../content";
/* User templates */
@source "../../../templates";
/* Theme templates */
@source "../../templates";
/* Use dark class for dark theme */
@custom-variant dark (&:where(.dark, .dark *));
@layer base {
/* Buttons use pointer cursor */
button:not(:disabled),
[role="button"]:not(:disabled) {
cursor: pointer;
}
}
/*
* Fix some code rendering bugs with PrismJS
* See https://github.com/PrismJS/prism/issues/2443
*/
@layer utilities {
.table {
display: initial;
}
}
/* Colorscheme, using sweetie palette */
:root {
--base: var(--ctp-latte-base);
--base-alt: var(--ctp-latte-mantle);
--surface: var(--ctp-latte-surface0);
--text: var(--ctp-latte-text);
--text-alt: var(--ctp-latte-subtext1);
--grey: var(--ctp-latte-overlay1);
--dark-grey: var(--ctp-latte-overlay0);
--magenta: var(--ctp-latte-mauve);
--red: var(--ctp-latte-red);
--orange: var(--ctp-latte-peach);
--yellow: var(--ctp-latte-yellow);
--green: var(--ctp-latte-green);
--teal: var(--ctp-latte-teal);
--cyan: var(--ctp-latte-sky);
--blue: var(--ctp-latte-blue);
--violet: var(--ctp-latte-lavender);
}
:root.dark {
--base: var(--ctp-mocha-base);
--base-alt: var(--ctp-mocha-mantle);
--surface: var(--ctp-mocha-surface0);
--text: var(--ctp-mocha-text);
--text-alt: var(--ctp-mocha-subtext1);
--grey: var(--ctp-mocha-overlay1);
--dark-grey: var(--ctp-mocha-overlay0);
--magenta: var(--ctp-mocha-mauve);
--red: var(--ctp-mocha-red);
--orange: var(--ctp-mocha-peach);
--yellow: var(--ctp-mocha-yellow);
--green: var(--ctp-mocha-green);
--teal: var(--ctp-mocha-teal);
--cyan: var(--ctp-mocha-sky);
--blue: var(--ctp-mocha-blue);
--violet: var(--ctp-mocha-lavender);
}
@theme static {
--font-sans:
"Fira Mono", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-mono:
"Fira Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
--color-base: var(--base);
--color-base-alt: var(--base-alt);
--color-surface: var(--surface);
--color-text: var(--text);
--color-text-alt: var(--text-alt);
--color-grey: var(--grey);
--color-dark-grey: var(--dark-grey);
--color-red: var(--red);
--color-orange: var(--orange);
--color-green: var(--green);
--color-teal: var(--teal);
--color-yellow: var(--yellow);
--color-blue: var(--blue);
--color-magenta: var(--magenta);
--color-violet: var(--violet);
--color-cyan: var(--cyan);
}
/* Overall design */
html {
scrollbar-color: var(--blue) var(--surface);
@apply scroll-smooth tabular-nums font-sans;
}
body {
@apply bg-base text-text antialiased font-medium;
}
main a {
@apply underline hover:text-blue;
}
a.icon {
@apply no-underline;
}
a {
@apply transition-colors duration-200 ease-in-out;
}
hr {
/* brightness-120 = #39394b */
@apply text-base-alt dark:brightness-120;
}
header,
footer {
@apply bg-surface text-text-alt;
}
h1,
h2,
h3,
h4,
h5,
h6 {
@apply font-bold;
}
h1 {
@apply text-3xl;
}
h2 {
@apply text-2xl;
counter-increment: h2;
counter-reset: h3;
}
h3 {
@apply text-xl;
counter-increment: h3;
counter-reset: h4;
}
h4 {
@apply text-lg;
counter-increment: h4;
}
h5 {
counter-increment: h5;
}
h6 {
@apply font-semibold;
counter-increment: h6;
}
p {
@apply leading-relaxed py-2;
}
strong {
@apply font-semibold;
}
ul {
@apply list-disc;
}
ol {
@apply list-decimal;
}
ul,
ol {
@apply leading-relaxed;
}
nav ul,
nav ol {
@apply mx-2 space-y-0 list-none;
}
main ul {
@apply pl-4;
}
/* Margins */
main h2,
article h2,
section h2 {
@apply mt-10;
}
main h3,
article h3,
section h3 {
@apply mt-8;
}
main h4,
article h4,
section h4 {
@apply mt-6;
}
main h5,
article h5,
section h5 {
@apply mt-4;
}
main h6,
article h6,
section h6 {
@apply mt-2;
}
/* Visual flair */
main div#content h2:not(:first-child) {
@apply border-t border-t-base-alt dark:border-t-[#39394b] pt-5;
}
main div#content h3:not(:first-child) {
@apply border-t border-t-base-alt dark:border-t-[#39394b] pt-4;
}
main div#content h4:not(:first-child) {
@apply border-t border-t-base-alt dark:border-t-[#39394b] pt-3;
}
main div#content h5:not(:first-child) {
@apply border-t border-t-base-alt dark:border-t-[#39394b] pt-2;
}
main div#content h6:not(:first-child) {
@apply border-t border-t-base-alt dark:border-t-[#39394b] pt-1;
}
blockquote {
@apply p-4 my-4 border-s-4 rounded-r-sm border-base-alt bg-surface dark:border-surface dark:bg-base-alt;
}
blockquote.tip {
@apply border-green bg-green/30;
}
blockquote.note {
@apply border-blue bg-blue/30;
}
blockquote.important {
@apply border-violet bg-violet/30;
}
blockquote.warning {
@apply border-yellow bg-yellow/30;
}
blockquote.error {
@apply border-red bg-red/30;
}
blockquote > p {
@apply leading-relaxed;
}
/* Inline verbatim `` */
code:not([class*="language-"]) {
@apply px-1 py-px font-mono text-sm rounded-md bg-base-alt dark:bg-surface dark:brightness-80;
}
/* Table of Contents */
nav.toc {
@apply h-3/4 pt-4 pb-4 font-mono bg-surface border-2 border-base-alt rounded-md;
}
nav.toc ol {
@apply pl-4 list-decimal list-inside;
}
nav.toc ul {
@apply pl-4 list-disc list-inside;
}
nav.toc ol li,
nav.toc ul li {
@apply mt-0 pb-0;
}
nav.toc ol li a,
nav.toc ul li a {
@apply no-underline hover:text-blue;
}
nav.toc ol li::marker,
nav.toc ul li::marker {
@apply hover:text-blue;
}
nav.toc ol li ol,
nav.toc ul li ul {
@apply pb-2;
}
/* PrismJS specific css */
pre[class*="language-"],
code[class*="language-"] {
font-variant-ligatures: common-ligatures !important;
@apply bg-surface! dark:bg-base-alt font-mono! text-shadow-none!;
}
/* PrismJS line-numbers plugin */
pre[class*="language-"].line-numbers {
counter-reset: linenumber;
@apply relative pl-13;
}
pre[class*="language-"].line-numbers > code {
white-space: inherit;
@apply relative;
}
.line-numbers .line-numbers-rows {
@apply absolute flex flex-col top-[-1.5px] -left-12 w-10 pointer-events-none select-none border-r! border-r-grey!;
}
.line-numbers-rows > span {
counter-increment: linenumber;
@apply block leading-[1.5];
}
.line-numbers-rows > span:before {
content: counter(linenumber);
@apply text-grey! text-right pr-2 block;
}
/* Center MermaidJS charts and diagrams */
pre.mermaid {
@apply flex justify-center;
}
/* Automatic dark theme for MermaidJS */
.dark .mermaid {
filter: invert(0.9) hue-rotate(180deg);
}

147
theme/templates/base.html Normal file
View File

@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="{{ config.language }}">
<head>
{% block head %}
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content="Norgolith" />
{# Dynamic meta tags #}
{% if metadata.description and not metadata.description == "nil" %}
<meta name="description" content="{{ metadata.description }}" />
{% endif %}
{% if metadata.authors %}
<meta name="author" content="{{ metadata.authors | join(sep=", ") }}" />
{% endif %}
{% if metadata.categories %}
<meta name="keywords" content="{{ metadata.categories | join(sep=", ") }}" />
{% endif %}
{# SEO Meta Tags #}
{% block seo_tags %}{% endblock seo_tags %}
{# Syntax highlighter #}
{% if config.highlighter is defined and config.highlighter.enable %}
{# If highlighter is enabled but the engine is not defined then fallback to prismjs #}
{% if config.highlighter.engine is not string or config.highlighter.engine == "prism" %}
{# PrismJS #}
{# Themes from automadcms:
<link
rel="stylesheet"
href="https://unpkg.com/automad-prism-themes@0.3.1/dist/prism-catppuccin-frappe.light-dark.css"
/>
#}
<link rel="stylesheet" href="/assets/css/prism-sweetie.min.css" />
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
{% elif config.highlighter.engine is defined
and config.highlighter.engine == "hljs" %}
{# Highlight.js #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/atom-one-dark.min.css">
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script> #}
{# Enable this one instead if you want all the `<code>` tags to be highlighted
<script>
document.addEventListener("DOMContentLoaded", (event) => {
document.querySelectorAll("code").forEach((block) => {
hljs.highlightBlock(block);
});
});
</script>
#}
{% elif config.highlighter.engine is string
and config.highlighter.engine not in ["prism", "hljs"] %}
<script>
window.alert("Warning: highlighter is enabled in the site configuration but its engine is not 'prism' nor 'hljs'");
</script>
{% endif %}
{% endif %}
{# AlpineJS #}
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/collapse@3.x.x/dist/cdn.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
<script>
document.addEventListener("alpine:init", () => {
Alpine.data("menu", () => ({
currentPage: window.location.pathname,
openMobile: false,
toggleMobile() {
this.openMobile = !this.openMobile;
}
}));
Alpine.data("toc", () => ({
open: false,
toggle() {
this.open = !this.open;
document.querySelector("#toc-toggle-icon").classList.toggle("rotate-90");
}
}));
Alpine.data("theme", () => ({
// Defaults to dark theme
current: "dark",
init() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme === "dark") {
this.current = "dark";
} else if (storedTheme === "light") {
this.current = "light";
} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
this.current = "dark";
}
localStorage.setItem("theme", this.current);
if (this.current === "dark") {
document.documentElement.classList.add("dark");
}
},
toggle() {
this.current = this.current === "dark" ? "light" : "dark";
document.documentElement.classList.toggle("dark", this.current === "dark");
localStorage.setItem("theme", this.current);
}
}));
});
</script>
{# MermaidJS #}
{% if config.extra.enable_mermaid %}
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.9.0/mermaid.min.js"></script>
{% endif %}
{# Icons #}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/3.28.1/tabler-icons.min.css">
{# Styling and favicon #}
<link rel="stylesheet" href="/assets/css/styles.min.css" />
{% if config.extra.favicon_path is defined and config.extra.favicon_path is string %}
<link rel="icon" href={{ config.extra.favicon_path }} />
{% else %}
<link rel="icon" href="/assets/norgolith.svg" />
{% endif %}
<title>{% block title %}{% endblock title %} - {{ config.title | title }}</title>
{% endblock head %}
</head>
<body>
<div class="transition-colors duration-150 ease-linear">
<header class="relative shadow-sm">
{% include "partials/nav.html" %}
</header>
<main class="container mx-auto min-h-screen pt-8 px-4 md:px-0">
{% block content %}{% endblock content %}
</main>
<footer class="mt-8 py-4 px-6 w-full font-mono">
{% include "partials/footer.html" %}
</footer>
</div>
</body>
</html>

View File

@@ -0,0 +1,33 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="Categories - {{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ config.rootUrl }}/categories" />
<meta property="og:description" content="Posts categories" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
{# TODO: add support for og:image using metadata #}
<link rel="canonical" href="{{ config.rootUrl }}/categories" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}Categories{% endblock title %}
{% block content %}
<div>
<h1>Categories</h1>
<p class="text-sm text-text/70"><i>All the categories used in posts.</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
{% for category in categories | sort %}
{%- set_global cat_posts = 0 -%}
{% for post in posts %}
{% if category in post.categories %}
{%- set_global cat_posts = cat_posts + 1 -%}
{% endif %}
{% endfor %}
<li>
<a class="font-mono text-lg no-underline! hover:underline! hover:decoration-dashed" href="/categories/{{ category }}">{{ category }}</a>
<span class="text-grey">({{ cat_posts }} post{{ cat_posts | pluralize }})</span>
</li>
{% endfor %}
</ul>
</div>
{% endblock content %}

View File

@@ -0,0 +1,31 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="Category: {{ category }} - {{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ config.rootUrl }}/categories/{{ category }}" />
<meta property="og:description" content="Posts on category {{ category }}" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
{# TODO: add support for og:image using metadata #}
<link rel="canonical" href="{{ config.rootUrl }}/categories/{{ category }}" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}Category: {{ category }}{% endblock title %}
{% block content %}
<div>
<h1>Posts in {{ category }}</h1>
<p class="text-sm text-text/70"><i>All the posts with the category "{{ category }}"</i></p>
<ul class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b]">
{% for post in posts | filter(attribute="draft", value=false) | sort(attribute="created") | reverse %}
{% if category in post.categories %}
<li>
<div class="flex flex-col md:flex-row space-x-4">
<a class="font-mono text-lg w-fit no-underline! hover:underline! hover:decoration-dashed" href="{{ post.permalink }}">{{ post.title }}</a>
<time class="text-grey text-sm italic"> on <strong>{{ post.created | date(format="%B %e, %Y") }}</strong></time>
</div>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endblock content %}

View File

@@ -0,0 +1,17 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="{{ metadata.title | title }} - {{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ metadata.permalink }}" />
<meta property="og:description" content="{{ metadata.description }}" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
{# TODO: add support for og:image using metadata #}
<link rel="canonical" href="{{ metadata.permalink }}" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}{{ metadata.title | title }}{% endblock title %}
{% block content %}
{{ content | safe }}
{% endblock content %}

45
theme/templates/home.html Normal file
View File

@@ -0,0 +1,45 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="{{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ metadata.permalink }}" />
<meta property="og:description" content="{{ metadata.description }}" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
{# TODO: add support for og:image using metadata #}
<link rel="canonical" href="{{ config.rootUrl }}" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}{{ metadata.title | title }}{% endblock title %}
{% block content %}
{{ content | safe }}
{# Latest 5 non-draft blog posts, ordered automatically by date #}
{% if posts | filter(attribute="draft", value=false) | length > 0 %}
<section>
<h2>Recent posts</h2>
{% for post in posts | filter(attribute="draft", value=false) | sort(attribute="created") | reverse | slice(end=5) %}
<div class="bg-surface p-4 mt-4 border-2 border-base-alt rounded-md shadow-lg">
<div class="flex flex-col">
<h3 class="mt-0! text-text-alt"><a class="no-underline! hover:underline! hover:decoration-dashed" href="{{ post.permalink }}">{{ post.title }}</a></h3>
<time class="text-dark-grey dark:text-grey" datetime="{{ post.created }}">{{ post.created | date(format="%B %e, %Y") }}</time>
<span class="text-sm text-grey italic">{{ post.description }}</span>
</div>
<div class="flex flex-col">
<p>
{% if post.truncate_char and post.truncate_char is matching("^nil$") %}
{% set truncate_char = "" %}
{% else %}
{% set truncate_char = "…" %}
{% endif %}
{{ post.raw | striptags | truncate(length=post.truncate | default(value=100), end=truncate_char) | safe }}
</p>
<a class="no-underline! text-dark-grey font-semibold" href="{{ post.permalink }}">Read more …</a>
</div>
</div>
{% endfor %}
</section>
{% endif %}
{% endblock content %}

View File

@@ -0,0 +1,30 @@
<div
class="flex flex-col md:flex-row justify-between md:items-center font-medium text-xs md:text-sm text-text-alt space-y-4 md:space-y-0"
>
<span
>Copyright &copy; {{ now(format="%Y") }}
{% if config.extra.footer_author_link %}
<a
href="{{ config.extra.footer_author_link }}"
class="text-blue hover:underline">{{ config.author }}</a
>.
{% else %}
{{ config.author }}.
{% endif %}
{% if config.extra.license %}
<br class="md:hidden" /> Licensed under {{ config.extra.license }}.
{% endif %}
</span>
<div class="flex flex-inline">
{% for name, link in config.extra.footer %}
<div class="mr-4 md:mr-6 lg:mr-8 last:mr-0">
<a
href="{{ link }}"
class="hover:text-blue"
>
<span>{{ name | title }}</span>
</a>
</div>
{% endfor %}
</div>
</div>

View File

@@ -0,0 +1,72 @@
<nav x-data="menu" class="container mx-auto px-4 md:px-0 font-mono">
<div class="flex items-center justify-between h-16">
<!-- Logo and dark mode -->
<div x-data="theme" class="flex items-center shrink-0 space-x-2">
<a href="/" class="flex items-center space-x-2">
<!-- <img src="{{ config.rootUrl }}/assets/norgolith.svg" alt="Norgolith Logo" class="h-8 w-8"> -->
<span class="text-lg md:text-xl font-bold text-magenta">{{ config.title | title }}</span>
</a>
<button
@click="toggle()"
type="button"
class="rounded-lg flex items-center"
:aria-label="current === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'"
>
<i
:class="current === 'dark' ? 'ti-sun hover:text-yellow' : 'ti-moon hover:text-blue'"
class="ti text-xl md:text-2xl text-grey transition-colors duration-200 ease-in-out"
></i>
</button>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex md:items-center md:space-x-8">
{% for name, link in config.extra.nav %}
<a
:class="{ 'text-magenta!': currentPage.startsWith('{{ link }}') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="{{ link }}"
>{{ name | title }}</a>
{% endfor %}
</div>
<!-- Mobile Menu Button -->
<div class="md:hidden">
<button @click="toggleMobile" type="button" class="inline-flex items-center justify-center p-2 rounded-md text-dark-grey hover:text-text-alt focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<span class="sr-only">Open main menu</span>
<!-- Hamburger Icon -->
<svg x-show="!openMobile" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
<!-- Close Icon -->
<svg x-show="openMobile" class="h-5 w-5 text-red" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div
x-show="openMobile"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.outside="openMobile = false"
class="md:hidden"
id="mobile-menu"
>
<div class="flex flex-row items-center justify-between pt-2 pb-4">
{% for name, link in config.extra.nav %}
<a
:class="{ 'text-blue!': currentPage.startsWith('{{ link }}') }"
class="text-text-alt hover:text-blue px-3 py-2 rounded-md text-sm font-medium"
href="{{ link }}"
>{{ name | title }}</a>
{% endfor %}
</div>
</div>
</nav>

77
theme/templates/post.html Normal file
View File

@@ -0,0 +1,77 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="{{ metadata.title | title }} - {{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ metadata.permalink }}" />
<meta property="og:description" content="{{ metadata.description }}" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
{# TODO: add support for og:image using metadata #}
<link rel="canonical" href="{{ metadata.permalink }}" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}{{ metadata.title | title }}{% endblock title %}
{% block content %}
<div>
<h1>{{ metadata.title }}</h1>
</div>
<div class="flex flex-col md:flex-row">
<div class="flex flex-col md:flex-row flex-1 justify-between">
<div class="flex flex-col space-y-2">
{# Date, reading time #}
{% set created = metadata.created | date(format="%B %e, %Y") %}
{% set updated = metadata.updated | date(format="%B %e, %Y") %}
<span class="text-grey text-sm tabular-nums text-opacity-70 dark:text-opacity-100 space-x-1">
<time datetime="{{ metadata.created }}">{{ created }}</time>
{% if created != updated %}
(Last edit: <time datetime="{{ metadata.updated }}">{{ metadata.updated | date(format="%B %e, %Y") }}</time>)
{% endif %}
</span>
</div>
{% if metadata.categories | length > 0 %}
<div class="flex flex-wrap items-center max-w-[50%]">
<span class="font-semibold mr-px">Tags:&nbsp;</span>
{% for category in metadata.categories %}
<a
class="w-fit bg-grey hover:bg-magenta text-base hover:text-base! no-underline! hover:no-underline! text-sm mr-2 last:mr-0 px-1 rounded-sm"
href="/categories/{{ category }}"
>
{{ category | capitalize }}
</a>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{% if metadata.toc %}
<div x-data="toc" class="mt-4">
{% set toc_html = generate_toc(toc=metadata.toc, list_type="ol") %}
<button @click="toggle()" type="button" class="inline-flex items-center">
<span class="sr-only">Close Table of Contents</span>
<h3 class="mt-0! mr-1">
Table of Contents
</h3>
<span
id="toc-toggle-icon"
class="transition-all duration-300 ease-in-out text-2xl hover:text-blue ti ti-arrow-badge-right-filled"
></span>
</button>
<nav
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
x-show="open"
class="toc"
>
{{ toc_html | safe }}
</nav>
</div>
{% endif %}
<div id="content" class="mt-12 break-keep pt-10 border-t border-t-base-alt dark:border-t-[#39394b]">
{{ content | safe }}
</div>
{% endblock content %}

View File

@@ -0,0 +1,38 @@
{% extends "base.html" %}
{% block seo_tags %}
<meta property="og:title" content="{{ metadata.title | title }} - {{ config.title | title }}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ metadata.permalink }}" />
<meta property="og:description" content="Posts on {{ config.title | title }}" />
<meta property="og:site_name" content="{{ config.title }}" />
<meta property="og:locale" content="{{ config.language }}" />
<link rel="canonical" href="{{ metadata.permalink }}" />
<meta name="robots" content="index, follow" />
{% endblock seo_tags %}
{% block title %}{{ metadata.title | title }}{% endblock title %}
{% block content %}
<h1 class="text-center">Posts</h1>
<div class="mt-6 pt-6 border-t border-t-base-alt dark:border-t-[#39394b] break-keep">
{% for post in posts | filter(attribute="draft", value=false) | sort(attribute="created") | reverse %}
<div class="bg-surface p-4 mt-4 border-2 border-base-alt rounded-xl shadow-lg">
<div class="flex flex-col">
<h3 class="mt-0! text-text-alt"><a class="no-underline! hover:underline! hover:decoration-dashed" href="{{ post.permalink }}">{{ post.title }}</a></h3>
<time class="text-dark-grey dark:text-grey" datetime="{{ post.created }}">{{ post.created | date(format="%B %e, %Y") }}</time>
<span class="text-sm text-grey italic">{{ post.description }}</span>
</div>
<div class="flex flex-col">
<p>
{% if post.truncate_char is defined and post.truncate_char is matching("^nil$") %}
{% set truncate_char = "" %}
{% else %}
{% set truncate_char = "…" %}
{% endif %}
{{ post.raw | striptags | truncate(length=post.truncate | default(value=300), end=truncate_char) | safe }}
</p>
<a class="no-underline! text-dark-grey font-semibold" href="{{ post.permalink }}">Read more …</a>
</div>
</div>
{% endfor %}
</div>
{% endblock content %}

33
theme/templates/rss.xml Normal file
View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ config.title }}</title>
<link>{{ config.rootUrl | escape_xml | safe }}</link>
<description>{{ config.rss.description | default(value="Latest posts")}}</description>
<generator>Norgolith</generator>
<language>{{ config.language }}</language>
<lastBuildDate>{{ now | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
<ttl>{{ config.rss.ttl | default(value=60) }}</ttl>
<atom:link href="{{ config.rootUrl }}/rss.xml" rel="self" type="application/rss+xml" />
<image>
<url>{{ config.rootUrl | escape_xml | safe }}{{ config.rss.image | default(value="/assets/favicon.svg") }}</url>
<title>{{ config.title }}</title>
<link>{{ config.rootUrl | escape_xml | safe }}</link>
<width>144</width>
<height>144</height>
</image>
{% for post in posts | filter(attribute="draft", value=false) | sort(attribute="created") | reverse %}
<item>
<title>{{ post.title }}</title>
<link>{{ post.permalink | escape_xml | safe }}</link>
<guid>{{ post.permalink | escape_xml | safe }}</guid>
<description>{{ post.description }}</description>
<author>{{ post.authors | join(sep=", ") }}</author>
<pubDate>{{ post.created | date(format="%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
{% if post.categories %}{% for category in post.categories %}<category>{{ category }}</category>{% endfor %}{% endif %}
</item>
{% endfor %}
</channel>
</rss>

5
theme/theme.toml Normal file
View File

@@ -0,0 +1,5 @@
name = "Norgowind"
author = "NTBBloodbath"
description = "Norgolith <3 TailwindCSS"
version = "0.4.1"
license = "MIT"