diff options
| author | Mitja Felicijan <m@mitjafelicijan.com> | 2023-07-08 23:25:41 +0200 |
|---|---|---|
| committer | Mitja Felicijan <m@mitjafelicijan.com> | 2023-07-08 23:25:41 +0200 |
| commit | cd6644ea4ddc78597934ab0ef5ba50e3c3daa927 (patch) | |
| tree | 03de331a8db6386dfd6fa75155bfbcea6b4feaf3 /themes/simple/layouts | |
| parent | 84ed124529ffeee1590295b8de3a8faf51848680 (diff) | |
| download | mitjafelicijan.com-cd6644ea4ddc78597934ab0ef5ba50e3c3daa927.tar.gz | |
Moved to a simpler SSG
Diffstat (limited to 'themes/simple/layouts')
| -rw-r--r-- | themes/simple/layouts/404.html | 0 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/_markup/render-image.html | 11 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/baseof.html | 14 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/index.json | 5 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/index.xml | 27 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/list.html | 48 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/notes.html | 101 | ||||
| -rw-r--r-- | themes/simple/layouts/_default/single.html | 61 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/comments.html | 9 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/footer.html | 62 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/head.html | 21 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/navigation.html | 29 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/read-more.html | 16 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/search.html | 191 | ||||
| -rw-r--r-- | themes/simple/layouts/partials/side-projects.html | 40 | ||||
| -rw-r--r-- | themes/simple/layouts/section/section.json | 5 | ||||
| -rw-r--r-- | themes/simple/layouts/section/section.xml | 27 | ||||
| -rw-r--r-- | themes/simple/layouts/tags/list.html | 91 |
18 files changed, 0 insertions, 758 deletions
diff --git a/themes/simple/layouts/404.html b/themes/simple/layouts/404.html deleted file mode 100644 index e69de29..0000000 --- a/themes/simple/layouts/404.html +++ /dev/null | |||
diff --git a/themes/simple/layouts/_default/_markup/render-image.html b/themes/simple/layouts/_default/_markup/render-image.html deleted file mode 100644 index d3df1fd..0000000 --- a/themes/simple/layouts/_default/_markup/render-image.html +++ /dev/null | |||
| @@ -1,11 +0,0 @@ | |||
| 1 | {{ $cachebuster := delimit (shuffle (split (md5 "6fab11c6669976d759d2992eff1dd5be") "" )) "" }} | ||
| 2 | |||
| 3 | <figure> | ||
| 4 | <a href="{{ .Destination }}" target="_blank"> | ||
| 5 | <img | ||
| 6 | loading="lazy" | ||
| 7 | src="{{ .Destination }}?v={{ $cachebuster }}" | ||
| 8 | alt="{{ .Text }}" title="{{ .Text }}"> | ||
| 9 | </a> | ||
| 10 | <figcaption>{{ .Text }}</figcaption> | ||
| 11 | </figure> | ||
diff --git a/themes/simple/layouts/_default/baseof.html b/themes/simple/layouts/_default/baseof.html deleted file mode 100644 index 79c7684..0000000 --- a/themes/simple/layouts/_default/baseof.html +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | <!DOCTYPE html> | ||
| 2 | <html lang="en"> | ||
| 3 | |||
| 4 | {{ partial "head.html" . }} | ||
| 5 | |||
| 6 | <body> | ||
| 7 | {{ partial "navigation.html" . }} | ||
| 8 | <div id="content"> | ||
| 9 | {{ block "main" . }}{{ end }} | ||
| 10 | </div> | ||
| 11 | {{ partial "footer.html" . }} | ||
| 12 | </body> | ||
| 13 | |||
| 14 | </html> \ No newline at end of file | ||
diff --git a/themes/simple/layouts/_default/index.json b/themes/simple/layouts/_default/index.json deleted file mode 100644 index b8f3786..0000000 --- a/themes/simple/layouts/_default/index.json +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | {{- $.Scratch.Add "index" slice -}} | ||
| 2 | {{- range .Site.RegularPages -}} | ||
| 3 | {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "type" .Type "permalink" .RelPermalink "summary" .Summary) -}} | ||
| 4 | {{- end -}} | ||
| 5 | {{- $.Scratch.Get "index" | jsonify -}} | ||
diff --git a/themes/simple/layouts/_default/index.xml b/themes/simple/layouts/_default/index.xml deleted file mode 100644 index 1f29133..0000000 --- a/themes/simple/layouts/_default/index.xml +++ /dev/null | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"> | ||
| 2 | |||
| 3 | <channel> | ||
| 4 | |||
| 5 | <title>{{ .Site.Author.name }}'s Blog</title> | ||
| 6 | <link>{{ .Permalink }}</link> | ||
| 7 | <description>{{ .Site.Params.description }}</description> | ||
| 8 | <language>en-us</language> | ||
| 9 | |||
| 10 | {{ range (where .Site.RegularPages "Section" "posts") }} | ||
| 11 | <item> | ||
| 12 | |||
| 13 | <title>{{ .Title }}</title> | ||
| 14 | <link>{{ .Permalink }}</link> | ||
| 15 | <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate> | ||
| 16 | {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}} | ||
| 17 | <guid>{{ .Permalink }}</guid> | ||
| 18 | |||
| 19 | <description>{{ "<![CDATA[" | safeHTML }} {{ .Summary }}]]></description> | ||
| 20 | <content:encoded>{{ "<![CDATA[" | safeHTML }} {{ .Content }}]]></content:encoded> | ||
| 21 | |||
| 22 | </item> | ||
| 23 | {{end}} | ||
| 24 | |||
| 25 | </channel> | ||
| 26 | |||
| 27 | </rss> | ||
diff --git a/themes/simple/layouts/_default/list.html b/themes/simple/layouts/_default/list.html deleted file mode 100644 index 6362b0f..0000000 --- a/themes/simple/layouts/_default/list.html +++ /dev/null | |||
| @@ -1,48 +0,0 @@ | |||
| 1 | {{ define "main" }} | ||
| 2 | <main role="main" class="container-blog mx-auto px-6 md:p-0"> | ||
| 3 | |||
| 4 | <!-- Search modal and results --> | ||
| 5 | {{ partial "search.html" . }} | ||
| 6 | |||
| 7 | <!-- Notes CTA --> | ||
| 8 | <a class="flex items-center gap-2 w-full bg-yellow-200 hover:cursor-pointer rounded mb-8 p-4" href="/notes.html"> | ||
| 9 | <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="hidden lg:block w-6 h-6"> | ||
| 10 | <path stroke-linecap="round" stroke-linejoin="round" d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25" /> | ||
| 11 | </svg> | ||
| 12 | <p>For interesting <span span class="italic font-medium">notes</span> and | ||
| 13 | small <span class="italic font-medium">experiments</span> I usually partake | ||
| 14 | in, check the <span class="font-medium">Notes page</span>.</p> | ||
| 15 | </a> | ||
| 16 | |||
| 17 | <h1 class="text-2xl font-bold mb-6">Blog posts</h1> | ||
| 18 | |||
| 19 | <!-- List of all blog posts --> | ||
| 20 | <nav itemscope itemtype="https://schema.org/SiteNavigationElement" class="mb-12" role="feed"> | ||
| 21 | <meta itemprop="name" content="Article list"> | ||
| 22 | {{ range (where .Site.RegularPages "Section" "posts") }} | ||
| 23 | <div> | ||
| 24 | <article class="mb-5" itemscope itemtype="http://schema.org/Article"> | ||
| 25 | <time class="block text-gray-400 font-medium text-xs mb-1">{{ .Date.Format "Monday Jan 2, 2006" }}</time> | ||
| 26 | <a href="/{{ .Params.url }}" itemprop="url" class="underline" rel="bookmark noopener" aria-label="Opens URL"> | ||
| 27 | {{ if .Params.draft }} | ||
| 28 | <span class="bg-orange-600 text-white px-1.5">Draft</span> | ||
| 29 | {{ end }} | ||
| 30 | {{.Title}} | ||
| 31 | </a> | ||
| 32 | </article> | ||
| 33 | </div> | ||
| 34 | {{ end }} | ||
| 35 | </nav> | ||
| 36 | |||
| 37 | <hr class="border-2 border-gray-100 mb-10"> | ||
| 38 | |||
| 39 | <!-- Projects I work on --> | ||
| 40 | {{ partial "side-projects.html" . }} | ||
| 41 | |||
| 42 | <hr class="border-2 border-gray-100 mb-10"> | ||
| 43 | |||
| 44 | <!-- Openring --> | ||
| 45 | {{ partial "openring.html" . }} | ||
| 46 | |||
| 47 | </main> | ||
| 48 | {{ end }} | ||
diff --git a/themes/simple/layouts/_default/notes.html b/themes/simple/layouts/_default/notes.html deleted file mode 100644 index f624814..0000000 --- a/themes/simple/layouts/_default/notes.html +++ /dev/null | |||
| @@ -1,101 +0,0 @@ | |||
| 1 | {{ define "main" }} | ||
| 2 | <main role="main" class="container-blog mx-auto px-6 md:p-0"> | ||
| 3 | |||
| 4 | <!-- Search modal and results --> | ||
| 5 | {{ partial "search.html" . }} | ||
| 6 | |||
| 7 | <section class="mb-6"> | ||
| 8 | <h1 class="text-2xl font-bold mb-2">Notes, notes and notes</h1> | ||
| 9 | <p class="text-gray-600 italic"> | ||
| 10 | Notes about things I learn, things I do, things I want to remember, | ||
| 11 | but never do. You can subscribe to this | ||
| 12 | <a href="/notes/index.xml" class="underline">RSS feed</a> | ||
| 13 | which contains only the notes without the blog posts. | ||
| 14 | </p> | ||
| 15 | </section> | ||
| 16 | |||
| 17 | <hr class="border-2 border-gray-100 mb-8"> | ||
| 18 | |||
| 19 | <!-- Dropdown selector to jump to note --> | ||
| 20 | <select id="jump-to-note" class="px-3 py-2 rounded mb-2 bg-gray-100 w-full md:w-auto"> | ||
| 21 | <option>Jump to note</option> | ||
| 22 | </select> | ||
| 23 | |||
| 24 | <!-- List all unique tags --> | ||
| 25 | <nav itemscope itemtype="https://schema.org/SiteNavigationElement" class="mt-6 mb-10" role="feed"> | ||
| 26 | <meta itemprop="name" content="Tag list"> | ||
| 27 | <section> | ||
| 28 | <ul class="flex flex-wrap gap-2"> | ||
| 29 | {{ range .Site.Taxonomies.tags }} | ||
| 30 | <li> | ||
| 31 | <a href="{{ .Page.Permalink }}" class="inline-block px-3 py-1 rounded bg-gray-100 hover:bg-yellow-200"> | ||
| 32 | {{ .Page.Title }} | ||
| 33 | </a> | ||
| 34 | </li> | ||
| 35 | {{ end }} | ||
| 36 | </ul> | ||
| 37 | </section> | ||
| 38 | </nav> | ||
| 39 | |||
| 40 | <!-- List of all notes --> | ||
| 41 | <nav itemscope itemtype="https://schema.org/SiteNavigationElement" class="mb-12" role="feed"> | ||
| 42 | <meta itemprop="name" content="Article list"> | ||
| 43 | <section> | ||
| 44 | {{ range (where .Site.RegularPages "Section" "notes") }} | ||
| 45 | <div class="mb-10"> | ||
| 46 | <article class="mb-5 single note" itemscope itemtype="http://schema.org/Article"> | ||
| 47 | <a href="/{{ .Params.url }}"> | ||
| 48 | <h2 class="text-xl font-medium notes-heading">{{.Title}}</h2> | ||
| 49 | </a> | ||
| 50 | <p class="text-gray-600 _italic text-sm flex flex-col md:flex-row gap-1"> | ||
| 51 | <time datetime="{{ .Date.Format "2006-01-02" }}" itemprop="datePublished"> | ||
| 52 | {{ .Date.Format "Monday Jan 2, 2006" }} | ||
| 53 | </time> | ||
| 54 | |||
| 55 | {{ if .Params.tags }} | ||
| 56 | <span class="hidden md:inline-block"> | ||
| 57 | <span>with tags</span> | ||
| 58 | <span class="inline-flex flex-row gap-1"> | ||
| 59 | <span>(</span> | ||
| 60 | {{ range .Params.tags }} | ||
| 61 | <a href="/tags/{{ . | urlize }}.html">{{ . }}</a> | ||
| 62 | {{ end }} | ||
| 63 | <span>)</span> | ||
| 64 | </span> | ||
| 65 | </span> | ||
| 66 | {{ end }} | ||
| 67 | <div class="content"> | ||
| 68 | {{ .Content | safeHTML }} | ||
| 69 | </div> | ||
| 70 | </article> | ||
| 71 | </div> | ||
| 72 | {{ end }} | ||
| 73 | </section> | ||
| 74 | </nav> | ||
| 75 | |||
| 76 | <script> | ||
| 77 | try { | ||
| 78 | const notes = document.querySelectorAll('h2'); | ||
| 79 | const select = document.querySelector('#jump-to-note'); | ||
| 80 | |||
| 81 | notes.forEach(note => { | ||
| 82 | const id = note.innerText.toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g, ''); | ||
| 83 | note.id = id; | ||
| 84 | note.innerHTML = `<a href="#${id}"></a>${note.innerHTML}`; | ||
| 85 | |||
| 86 | const option = document.createElement('option'); | ||
| 87 | option.value = id; | ||
| 88 | option.innerText = note.innerText; | ||
| 89 | select.appendChild(option); | ||
| 90 | |||
| 91 | select.addEventListener('change', () => { | ||
| 92 | window.location.hash = select.value; | ||
| 93 | }); | ||
| 94 | }); | ||
| 95 | } catch (error) { | ||
| 96 | console.error(error); | ||
| 97 | } | ||
| 98 | </script> | ||
| 99 | |||
| 100 | </main> | ||
| 101 | {{ end }} | ||
diff --git a/themes/simple/layouts/_default/single.html b/themes/simple/layouts/_default/single.html deleted file mode 100644 index 095ff25..0000000 --- a/themes/simple/layouts/_default/single.html +++ /dev/null | |||
| @@ -1,61 +0,0 @@ | |||
| 1 | {{ define "main" }} | ||
| 2 | <main role="main" class="container-blog mx-auto px-6 md:p-0"> | ||
| 3 | |||
| 4 | <!-- Search modal and results --> | ||
| 5 | {{ partial "search.html" . }} | ||
| 6 | |||
| 7 | <!-- Single article --> | ||
| 8 | <article itemtype="http://schema.org/Article" class="single mb-12"> | ||
| 9 | <header class="mb-6"> | ||
| 10 | <h1 itemtype="headline" class="text-4xl font-bold mb-4 leading-1 md:leading-2">{{ .Title }}</h1> | ||
| 11 | |||
| 12 | {{ if not (eq .Type "pages") }} | ||
| 13 | <time class="text-gray-400 font-medium text-sm">Published on {{ .Date.Format "Monday Jan 2, 2006" }}</time> | ||
| 14 | {{ end }} | ||
| 15 | </header> | ||
| 16 | |||
| 17 | {{ if not .Params.hidetoc }} | ||
| 18 | <div> | ||
| 19 | {{ if ge (len .TableOfContents) 100 }} | ||
| 20 | <p class="font-semibold">Table of contents</p> | ||
| 21 | <div>{{ .TableOfContents }}</div> | ||
| 22 | {{ end }} | ||
| 23 | </div> | ||
| 24 | {{ end }} | ||
| 25 | |||
| 26 | <div class="leading-relaxed content"> | ||
| 27 | {{.Content}} | ||
| 28 | </div> | ||
| 29 | </article> | ||
| 30 | |||
| 31 | {{ if not (eq .Type "pages") }} | ||
| 32 | <hr class="border-2 border-gray-100 mb-10" /> | ||
| 33 | {{ end }} | ||
| 34 | |||
| 35 | <!-- Comment, contact --> | ||
| 36 | {{ if not (eq .Type "pages") }} | ||
| 37 | <section class="mb-10"> | ||
| 38 | {{ partial "comments.html" . }} | ||
| 39 | </section> | ||
| 40 | {{ end }} | ||
| 41 | |||
| 42 | {{ if not (eq .Type "pages") }} | ||
| 43 | <hr class="border-2 border-gray-100 mb-10" /> | ||
| 44 | {{ end }} | ||
| 45 | |||
| 46 | <!-- Read more --> | ||
| 47 | {{ if not (eq .Type "pages") }} | ||
| 48 | {{ partial "read-more.html" . }} | ||
| 49 | {{ end }} | ||
| 50 | |||
| 51 | {{ if in .Type "posts" }} | ||
| 52 | <hr class="border-2 border-gray-100 mb-10"> | ||
| 53 | {{ end }} | ||
| 54 | |||
| 55 | <!-- Openring --> | ||
| 56 | {{ if in .Type "posts" }} | ||
| 57 | {{ partial "openring.html" . }} | ||
| 58 | {{ end }} | ||
| 59 | |||
| 60 | </main> | ||
| 61 | {{ end }} | ||
diff --git a/themes/simple/layouts/partials/comments.html b/themes/simple/layouts/partials/comments.html deleted file mode 100644 index 50c28ca..0000000 --- a/themes/simple/layouts/partials/comments.html +++ /dev/null | |||
| @@ -1,9 +0,0 @@ | |||
| 1 | <section class="comments"> | ||
| 2 | <h2 class="text-xl font-bold mb-2">Want to comment or have something to add?</h2> | ||
| 3 | |||
| 4 | <p class="mb-10"> | ||
| 5 | You can write me an email at | ||
| 6 | <a href="mailto:m@mitjafelicijan.com" class="underline-offset-2 underline">m@mitjafelicijan.com</a> or catch up with me | ||
| 7 | <a href="https://telegram.me/mitjafelicijan" target="_blank" class="underline-offset-2 underline">on Telegram</a>. | ||
| 8 | </p> | ||
| 9 | </section> | ||
diff --git a/themes/simple/layouts/partials/footer.html b/themes/simple/layouts/partials/footer.html deleted file mode 100644 index 8367f21..0000000 --- a/themes/simple/layouts/partials/footer.html +++ /dev/null | |||
| @@ -1,62 +0,0 @@ | |||
| 1 | <footer class="container-blog mx-auto px-6 md:p-0 text-gray-400 text-sm"> | ||
| 2 | <hr class="border-2 border-gray-100 my-12"> | ||
| 3 | <p class="pb-16"> | ||
| 4 | This website does not track you. | ||
| 5 | Content is made available under the <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" | ||
| 6 | rel="noreferrer" class="underline-offset-2 underline hover:text-gray-800">CC BY 4.0 | ||
| 7 | license</a> unless specified otherwise. | ||
| 8 | Blog feed is available as <a href="/index.xml" target="_blank" | ||
| 9 | class="underline-offset-2 underline hover:text-gray-800">RSS feed</a>. | ||
| 10 | </p> | ||
| 11 | </footer> | ||
| 12 | |||
| 13 | <!-- Fathom - beautiful, simple website analytics --> | ||
| 14 | <script src="https://cdn.usefathom.com/script.js" data-site="XHQARKXP" defer></script> | ||
| 15 | |||
| 16 | {{ if ne .IsHome true }} | ||
| 17 | <!-- KaTeX math library --> | ||
| 18 | <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.css" | ||
| 19 | integrity="sha384-RZU/ijkSsFbcmivfdRBQDtwuwVqK7GMOw6IMvKyeWL2K5UAlyp6WonmB8m7Jd0Hn" crossorigin="anonymous"> | ||
| 20 | <script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.js" | ||
| 21 | integrity="sha384-pK1WpvzWVBQiP0/GjnvRxV4mOb0oxFuyRxJlk6vVw146n3egcN5C925NCP7a7BY8" crossorigin="anonymous"></script> | ||
| 22 | <script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/contrib/auto-render.min.js" | ||
| 23 | integrity="sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl" crossorigin="anonymous" | ||
| 24 | onload="renderMathInElement(document.body);"></script> | ||
| 25 | {{ end }} | ||
| 26 | |||
| 27 | {{ if ne .IsHome true }} | ||
| 28 | <!-- Lazy loading of iframes --> | ||
| 29 | <script> | ||
| 30 | window.addEventListener('load', () => { | ||
| 31 | const iframes = document.querySelectorAll('.ll-iframe'); | ||
| 32 | |||
| 33 | if (iframes) { | ||
| 34 | iframes.forEach(iframe => { | ||
| 35 | iframe.addEventListener('click', (evt) => { | ||
| 36 | // If there are no elements yet in the target element add iframe. | ||
| 37 | if (!evt.target.dataset.alreadyLoaded) { | ||
| 38 | // Setting this element as already loaded so it doesn't | ||
| 39 | // attempt to load it again. | ||
| 40 | evt.target.dataset.alreadyLoaded = true; | ||
| 41 | |||
| 42 | // Clearing up all existing elements inside of the target one. | ||
| 43 | evt.target.innerHTML = ''; | ||
| 44 | evt.target.classList.add('empty'); | ||
| 45 | evt.target.classList.add('border-0'); | ||
| 46 | |||
| 47 | // Creating iframe DOM element. | ||
| 48 | const iframeElement = document.createElement('iframe'); | ||
| 49 | iframeElement.classList.add('w-full'); | ||
| 50 | iframeElement.classList.add('h-full'); | ||
| 51 | iframeElement.classList.add('rounded'); | ||
| 52 | iframeElement.src = evt.target.dataset.src; | ||
| 53 | |||
| 54 | // Appending iframe as a child of current element. | ||
| 55 | evt.target.appendChild(iframeElement); | ||
| 56 | } | ||
| 57 | }); | ||
| 58 | }); | ||
| 59 | } | ||
| 60 | }); | ||
| 61 | </script> | ||
| 62 | {{ end }} \ No newline at end of file | ||
diff --git a/themes/simple/layouts/partials/head.html b/themes/simple/layouts/partials/head.html deleted file mode 100644 index fc481fc..0000000 --- a/themes/simple/layouts/partials/head.html +++ /dev/null | |||
| @@ -1,21 +0,0 @@ | |||
| 1 | {{ $cachebuster := delimit (shuffle (split (md5 "6fab11c6669976d759d2992eff1dd5be") "" )) "" }} | ||
| 2 | |||
| 3 | <meta charset="UTF-8"> | ||
| 4 | <meta name="theme-color" content="#ffffff"> | ||
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
| 6 | |||
| 7 | <link rel="alternate" type="application/rss+xml" href="/index.xml" title="{{ .Site.Author.name }}"> | ||
| 8 | <link rel="alternate" type="application/rss+xml" href="/notes/index.xml" title="{{ .Site.Author.name }} - Notes"> | ||
| 9 | |||
| 10 | <link rel="stylesheet" href="/general/index.css?v={{ $cachebuster }}"> | ||
| 11 | |||
| 12 | <link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel="icon" type="image/x-icon" /> | ||
| 13 | |||
| 14 | <title>{{ .Title }}</title> | ||
| 15 | <meta name="description" content="{{ .Site.Params.description }}" /> | ||
| 16 | |||
| 17 | <meta property="og:type" content="article"> | ||
| 18 | <meta property="og:title" content="{{ .Title }}"> | ||
| 19 | <meta property="og:description" content="{{ if .Summary }}{{ .Summary }}{{ else }}{{ .Site.Params.Description }}{{ end }}"> | ||
| 20 | <meta property="og:url" content="https://mitjafelicijan.com/{{ .Params.url }}"> | ||
| 21 | <meta property="og:image" content="https://mitjafelicijan.com/general/og-big.jpg?v={{ $cachebuster }}"> | ||
diff --git a/themes/simple/layouts/partials/navigation.html b/themes/simple/layouts/partials/navigation.html deleted file mode 100644 index 73ae0ce..0000000 --- a/themes/simple/layouts/partials/navigation.html +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | <div class="container-blog mx-auto px-6 md:p-0"> | ||
| 2 | <header class="flex py-4 mt-4 mb-8 flex-col md:flex-row items-center "> | ||
| 3 | <div class="flex-grow mb-2 md:mb-0"> | ||
| 4 | <a href="/" itemprop="url" class="text-xl font-semibold hover:underline">Mitja Felicijan</a> | ||
| 5 | </div> | ||
| 6 | |||
| 7 | <nav itemscope itemtype="http://schema.org/SiteNavigationElement" class="flex items-center gap-1" role="toolbar"> | ||
| 8 | <meta itemprop="name" content="Main Menu"> | ||
| 9 | |||
| 10 | <!-- Search button --> | ||
| 11 | <span class="hidden lg:block"> | ||
| 12 | <span class="search-button flex gap-2 items-center text-gray-500 bg-gray-100 hover:bg-gray-200 rounded px-2 py-1 text-xs cursor-pointer mr-2 hidden" onclick="showSearchModal()"> | ||
| 13 | <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="4" stroke="currentColor" class="w-3 h-3"> | ||
| 14 | <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" /> | ||
| 15 | </svg> | ||
| 16 | <span class="search-button-text font-bold"></span> | ||
| 17 | </span> | ||
| 18 | </span> | ||
| 19 | |||
| 20 | <a href="/notes.html" class="font-medium px-2 hover:bg-yellow-200 rounded">Notes</a> | ||
| 21 | <a href="https://telegram.me/mitjafelicijan" target="_blank" rel="noopener nofollow" itemprop="url" class="font-medium px-2 hover:bg-yellow-200 rounded">Telegram</a> | ||
| 22 | <a href="https://git.mitjafelicijan.com" target="_blank" rel="noopener nofollow" itemprop="url" class="font-medium px-2 hover:bg-yellow-200 rounded">Git</a> | ||
| 23 | <a href="https://files.mitjafelicijan.com" target="_blank" rel="noopener nofollow" itemprop="url" class="font-medium px-2 hover:bg-yellow-200 rounded hidden md:block">Files</a> | ||
| 24 | <a href="/mitjafelicijan.pgp.pub.txt" itemprop="url" class="font-medium px-2 hover:bg-yellow-200 rounded">PGP</a> | ||
| 25 | <a href="/curriculum-vitae.html" class="font-medium px-2 hover:bg-yellow-200 rounded">CV</a> | ||
| 26 | <a href="/index.xml" itemprop="url" class="font-medium px-2 hover:bg-yellow-200 rounded hidden md:block">RSS</a> | ||
| 27 | </nav> | ||
| 28 | </header> | ||
| 29 | </div> | ||
diff --git a/themes/simple/layouts/partials/read-more.html b/themes/simple/layouts/partials/read-more.html deleted file mode 100644 index 9de1554..0000000 --- a/themes/simple/layouts/partials/read-more.html +++ /dev/null | |||
| @@ -1,16 +0,0 @@ | |||
| 1 | <section> | ||
| 2 | <h2 class="text-2xl font-bold mb-6">Read more from this site</h2> | ||
| 3 | <nav itemscope itemtype="https://schema.org/SiteNavigationElement" class="mb-12"> | ||
| 4 | <meta itemprop="name" content="Article list"> | ||
| 5 | <nav class="flex flex-col gap-4"> | ||
| 6 | {{ $randomPosts := shuffle (where .Site.RegularPages "Type" "posts") | first 5 }} | ||
| 7 | {{ range $randomPosts }} | ||
| 8 | <div> | ||
| 9 | <time class="block text-gray-400 font-medium text-xs">{{ .Date.Format "Mon Jan 2, 2006" }}</time> | ||
| 10 | <a href="/{{ .Params.url }}" itemprop="url" class="block underline font-medium mb-1">{{ .Title }}</a> | ||
| 11 | <p class="text-gray-600 text-sm">{{ .Summary }}</p> | ||
| 12 | </div> | ||
| 13 | {{ end }} | ||
| 14 | </nav> | ||
| 15 | </nav> | ||
| 16 | </section> | ||
diff --git a/themes/simple/layouts/partials/search.html b/themes/simple/layouts/partials/search.html deleted file mode 100644 index f157f03..0000000 --- a/themes/simple/layouts/partials/search.html +++ /dev/null | |||
| @@ -1,191 +0,0 @@ | |||
| 1 | {{ $cachebuster := delimit (shuffle (split (md5 "6fab11c6669976d759d2992eff1dd5be") "" )) "" }} | ||
| 2 | |||
| 3 | <section class="search-modal mb-10 hidden"> | ||
| 4 | <input class="bg-gray-100 w-full px-3 py-2 rounded outline-none" type="search" placeholder="Search here..."> | ||
| 5 | <section class="results bg-white border border-gray-200 shadow-md p-2 flex flex-col gap-2 rounded mt-4 hidden"></section> | ||
| 6 | </section> | ||
| 7 | |||
| 8 | <script src="https://unpkg.com/lunr/lunr.js"></script> | ||
| 9 | <script> | ||
| 10 | (async function() { | ||
| 11 | const debounceDelay = 700; | ||
| 12 | const maxSearchResults = 10; | ||
| 13 | |||
| 14 | // Fetch search index generated by Hugo. | ||
| 15 | const req = await fetch('/index.json?v={{ $cachebuster }}'); | ||
| 16 | window.searchDocuments = await req.json(); | ||
| 17 | |||
| 18 | window.searchIndex = lunr(function() { | ||
| 19 | this.ref('permalink'); | ||
| 20 | this.field('title', { boost: 20 }); | ||
| 21 | this.field('tags', { boost: 10 }); | ||
| 22 | this.field('summary', { boost: 1 }); | ||
| 23 | |||
| 24 | window.searchDocuments.forEach(function(doc) { | ||
| 25 | this.add(doc); | ||
| 26 | }, this); | ||
| 27 | |||
| 28 | console.log('Search index processed...'); | ||
| 29 | }) | ||
| 30 | |||
| 31 | // Connect DOM and search the index. | ||
| 32 | let cachedSearchTerm = null; | ||
| 33 | const searchModal = document.querySelector('.search-modal'); | ||
| 34 | const searchInput = document.querySelector('.search-modal input'); | ||
| 35 | const searchResults = document.querySelector('.search-modal .results'); | ||
| 36 | |||
| 37 | // Display search modal. | ||
| 38 | window.showSearchModal = function() { | ||
| 39 | searchModal.classList.remove('hidden'); | ||
| 40 | searchInput.focus(); | ||
| 41 | } | ||
| 42 | |||
| 43 | // Detect OS and sets proper search button text. | ||
| 44 | const searchButtonElement = document.querySelector('.search-button'); | ||
| 45 | const searchButtonTextElement = document.querySelector('.search-button-text'); | ||
| 46 | if (searchButtonElement) { | ||
| 47 | let searchButtonText = 'Ctrl+K'; | ||
| 48 | if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { | ||
| 49 | searchButtonText = '⌘+K'; | ||
| 50 | } | ||
| 51 | searchButtonTextElement.innerText = searchButtonText; | ||
| 52 | searchButtonElement.classList.remove('hidden'); | ||
| 53 | } | ||
| 54 | |||
| 55 | // On keyboard shortcut shows search modal. | ||
| 56 | let currentSearchResultsSectionIndex = -1; | ||
| 57 | const itemHoverClass = 'bg-gray-100'; | ||
| 58 | document.addEventListener('keydown', function(event) { | ||
| 59 | // Handles macOS CMD+k. | ||
| 60 | if ((event.ctrlKey || event.metaKey) && event.key === 'k') { | ||
| 61 | event.preventDefault(); | ||
| 62 | showSearchModal(); | ||
| 63 | } | ||
| 64 | |||
| 65 | // Handles Windows/Linux Ctrl+k. | ||
| 66 | if (event.ctrlKey && event.key === 'k') { | ||
| 67 | event.preventDefault(); | ||
| 68 | showSearchModal(); | ||
| 69 | } | ||
| 70 | |||
| 71 | |||
| 72 | // If ESC is pressed when the input is empty close the search modal. | ||
| 73 | if (event.key === 'Escape' || event.key === 'Esc') { | ||
| 74 | if (searchInput.value.length == 0) { | ||
| 75 | if (!searchModal.classList.contains('hidden')) { | ||
| 76 | cachedSearchTerm = null; | ||
| 77 | searchModal.classList.add('hidden'); | ||
| 78 | searchResults.innerText = ''; | ||
| 79 | if (!searchResults.classList.contains('hidden')) { | ||
| 80 | searchResults.classList.add('hidden'); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | } else { | ||
| 84 | const listItems = searchResults.querySelectorAll('a'); | ||
| 85 | listItems.forEach(el => el.classList.remove(itemHoverClass)); | ||
| 86 | currentSearchResultsSectionIndex = -1; | ||
| 87 | searchInput.focus(); | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | |||
| 92 | // Arrow UP/DOWN movement through search results. | ||
| 93 | if (event.key === 'ArrowUp') { | ||
| 94 | if (!searchResults.classList.contains('hidden')) { | ||
| 95 | event.preventDefault(); | ||
| 96 | |||
| 97 | const listItems = searchResults.querySelectorAll('a'); | ||
| 98 | listItems.forEach(el => el.classList.remove(itemHoverClass)); | ||
| 99 | currentSearchResultsSectionIndex--; | ||
| 100 | |||
| 101 | if (!listItems[currentSearchResultsSectionIndex]) { | ||
| 102 | currentSearchResultsSectionIndex = -1; | ||
| 103 | searchInput.focus(); | ||
| 104 | } | ||
| 105 | |||
| 106 | if (currentSearchResultsSectionIndex != -1) { | ||
| 107 | listItems[currentSearchResultsSectionIndex].classList.add(itemHoverClass); | ||
| 108 | listItems[currentSearchResultsSectionIndex].focus(); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | } | ||
| 112 | if (event.key === 'ArrowDown') { | ||
| 113 | if (!searchResults.classList.contains('hidden')) { | ||
| 114 | event.preventDefault(); | ||
| 115 | |||
| 116 | const listItems = searchResults.querySelectorAll('a'); | ||
| 117 | listItems.forEach(el => el.classList.remove(itemHoverClass)); | ||
| 118 | currentSearchResultsSectionIndex++; | ||
| 119 | |||
| 120 | if (!listItems[currentSearchResultsSectionIndex]) { | ||
| 121 | currentSearchResultsSectionIndex = 0; | ||
| 122 | } | ||
| 123 | |||
| 124 | if (currentSearchResultsSectionIndex != -1) { | ||
| 125 | listItems[currentSearchResultsSectionIndex].classList.add(itemHoverClass); | ||
| 126 | listItems[currentSearchResultsSectionIndex].focus(); | ||
| 127 | } | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | }); | ||
| 132 | |||
| 133 | // Debounce magic. | ||
| 134 | function debounce(func, delay) { | ||
| 135 | let timerId; | ||
| 136 | return function (...args) { | ||
| 137 | clearTimeout(timerId); | ||
| 138 | timerId = setTimeout(() => { | ||
| 139 | func.apply(this, args); | ||
| 140 | }, delay); | ||
| 141 | }; | ||
| 142 | } | ||
| 143 | |||
| 144 | // Do the actual search. | ||
| 145 | searchInput.addEventListener('keyup', debounce((evt)=> { | ||
| 146 | const query = evt.target.value.trim().toLowerCase(); | ||
| 147 | if (query.length && query != cachedSearchTerm) { | ||
| 148 | const results = searchIndex.search(`*${query}*`); | ||
| 149 | |||
| 150 | if (results.length == 0) { | ||
| 151 | if (!searchResults.classList.contains('hidden')) { | ||
| 152 | searchResults.classList.add('hidden'); | ||
| 153 | } | ||
| 154 | } else { | ||
| 155 | searchResults.innerText = ''; | ||
| 156 | searchResults.classList.remove('hidden'); | ||
| 157 | cachedSearchTerm = query; | ||
| 158 | |||
| 159 | results.slice(0, maxSearchResults).forEach(resultItem => { | ||
| 160 | const item = window.searchDocuments.find(doc => doc.permalink === resultItem.ref); | ||
| 161 | |||
| 162 | const link = document.createElement('a'); | ||
| 163 | link.href = item.permalink; | ||
| 164 | link.classList.add('hover:bg-gray-100', 'cursor-pointer', 'py-2', 'px-3', 'rounded'); | ||
| 165 | |||
| 166 | const title = document.createElement('div'); | ||
| 167 | title.classList.add('text-gray-800', 'font-medium'); | ||
| 168 | title.innerHTML = item.title; | ||
| 169 | link.appendChild(title); | ||
| 170 | |||
| 171 | const meta = document.createElement('div'); | ||
| 172 | meta.classList.add('text-gray-500', 'flex', 'items-center', 'gap-2'); | ||
| 173 | |||
| 174 | const section = document.createElement('span'); | ||
| 175 | section.classList.add('uppercase', 'text-xs', 'font-medium', 'bg-gray-200', 'px-1', 'rounded') | ||
| 176 | section.innerText = item.type; | ||
| 177 | meta.appendChild(section); | ||
| 178 | |||
| 179 | const summary = document.createElement('span'); | ||
| 180 | const summaryText = item.summary.length > 80 ? `${item.summary.substring(0, 80)}...` : item.summary; | ||
| 181 | summary.innerHTML = summaryText; | ||
| 182 | meta.appendChild(summary); | ||
| 183 | |||
| 184 | link.appendChild(meta); | ||
| 185 | searchResults.appendChild(link); | ||
| 186 | }); | ||
| 187 | } | ||
| 188 | } | ||
| 189 | }, debounceDelay)); | ||
| 190 | })(); | ||
| 191 | </script> | ||
diff --git a/themes/simple/layouts/partials/side-projects.html b/themes/simple/layouts/partials/side-projects.html deleted file mode 100644 index 462ff45..0000000 --- a/themes/simple/layouts/partials/side-projects.html +++ /dev/null | |||
| @@ -1,40 +0,0 @@ | |||
| 1 | <section class="mb-12"> | ||
| 2 | <h2 class="text-2xl font-bold mb-6">Side projects I work/worked on</h2> | ||
| 3 | |||
| 4 | <nav class="flex flex-col gap-4 md:gap-0 md:border w-full mb-4"> | ||
| 5 | <a href="https://git.mitjafelicijan.com/cord.h.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 6 | <span class="block md:inline-block md:w-40 underline">cord.h</span> | ||
| 7 | <span>Small C library for handling strings</span> | ||
| 8 | </a> | ||
| 9 | <a href="https://git.mitjafelicijan.com/mprogress.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 10 | <span class="block md:block md:inline-block md:w-40 underline">mprogress</span> | ||
| 11 | <span>Tiny utility that displays progress bar in terminal</span> | ||
| 12 | </a> | ||
| 13 | <a href="https://git.mitjafelicijan.com/journalctl-proxy.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 14 | <span class="block md:inline-block md:w-40 underline">journalctl-proxy</span> | ||
| 15 | <span>Exposes your systemd logs to web via web interface</span> | ||
| 16 | </a> | ||
| 17 | <a href="https://git.mitjafelicijan.com/redis-marshal.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 18 | <span class="block md:inline-block md:w-40 underline">redis-marshal</span> | ||
| 19 | <span>Lightweight Redis data exploration tool</span> | ||
| 20 | </a> | ||
| 21 | <a href="https://git.mitjafelicijan.com/dna-encoding.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 22 | <span class="block md:inline-block md:w-40 underline">dna-encoding</span> | ||
| 23 | <span>Tools for encoding files to DNA sequence</span> | ||
| 24 | </a> | ||
| 25 | <a href="https://git.mitjafelicijan.com/vertex.git/" target="_blank" rel="noopener nofollow" class="block md:p-3 md:hover:bg-yellow-200 md:border-b"> | ||
| 26 | <span class="block md:inline-block md:w-40 underline">vertex</span> | ||
| 27 | <span>Create mock API's and add basic logic to simplify prototyping</span> | ||
| 28 | </a> | ||
| 29 | <a href="https://git.mitjafelicijan.com/scarecrow.git/" target="_blank" rel="noopener nofollow" class="block md:hover:bg-yellow-200 md:p-3"> | ||
| 30 | <span class="block md:inline-block md:w-40 underline">scarecrow</span> | ||
| 31 | <span>Minimal configuration reverse proxy</span> | ||
| 32 | </a> | ||
| 33 | </nav> | ||
| 34 | |||
| 35 | <p class="text-gray-500 italic">* For more projects, check out | ||
| 36 | my <a href="https://git.mitjafelicijan.com/" class="underline">Git | ||
| 37 | server</a>. Most of the projects there are probably work in progress and | ||
| 38 | should be considered as such.</p> | ||
| 39 | |||
| 40 | </section> | ||
diff --git a/themes/simple/layouts/section/section.json b/themes/simple/layouts/section/section.json deleted file mode 100644 index b8f3786..0000000 --- a/themes/simple/layouts/section/section.json +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | {{- $.Scratch.Add "index" slice -}} | ||
| 2 | {{- range .Site.RegularPages -}} | ||
| 3 | {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "type" .Type "permalink" .RelPermalink "summary" .Summary) -}} | ||
| 4 | {{- end -}} | ||
| 5 | {{- $.Scratch.Get "index" | jsonify -}} | ||
diff --git a/themes/simple/layouts/section/section.xml b/themes/simple/layouts/section/section.xml deleted file mode 100644 index 889cf08..0000000 --- a/themes/simple/layouts/section/section.xml +++ /dev/null | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"> | ||
| 2 | |||
| 3 | <channel> | ||
| 4 | |||
| 5 | <title>{{ .Site.Author.name }}'s Notes</title> | ||
| 6 | <link>{{ .Permalink }}</link> | ||
| 7 | <description>{{ .Site.Params.description }}</description> | ||
| 8 | <language>en-us</language> | ||
| 9 | |||
| 10 | {{ range (where .Site.RegularPages "Section" "notes") }} | ||
| 11 | <item> | ||
| 12 | |||
| 13 | <title>{{ .Title }}</title> | ||
| 14 | <link>{{ .Permalink }}</link> | ||
| 15 | <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate> | ||
| 16 | {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}} | ||
| 17 | <guid>{{ .Permalink }}</guid> | ||
| 18 | |||
| 19 | <description>{{ "<![CDATA[" | safeHTML }} {{ .Summary }}]]></description> | ||
| 20 | <content:encoded>{{ "<![CDATA[" | safeHTML }} {{ .Content }}]]></content:encoded> | ||
| 21 | |||
| 22 | </item> | ||
| 23 | {{end}} | ||
| 24 | |||
| 25 | </channel> | ||
| 26 | |||
| 27 | </rss> | ||
diff --git a/themes/simple/layouts/tags/list.html b/themes/simple/layouts/tags/list.html deleted file mode 100644 index bd3bd57..0000000 --- a/themes/simple/layouts/tags/list.html +++ /dev/null | |||
| @@ -1,91 +0,0 @@ | |||
| 1 | {{ define "main" }} | ||
| 2 | <main role="main" class="container-blog mx-auto px-6 md:p-0"> | ||
| 3 | |||
| 4 | <!-- Search modal and results --> | ||
| 5 | {{ partial "search.html" . }} | ||
| 6 | |||
| 7 | <section class="mb-6"> | ||
| 8 | <h1 class="text-2xl font-bold mb-2 italic"> | ||
| 9 | <span class="blue">{{ .Title }}</span> | ||
| 10 | <span>//</span> | ||
| 11 | <span>notes</span> | ||
| 12 | <span>//</span> | ||
| 13 | <span class="text-sm">{{ len .Pages }} of them</span> | ||
| 14 | </h1> | ||
| 15 | <p class="text-gray-600 italic"> | ||
| 16 | Notes about things I learn, things I do, things I want to remember, | ||
| 17 | but never do. You can subscribe to this | ||
| 18 | <a href="/notes.xml" class="underline">RSS feed</a> | ||
| 19 | which contains only the notes without the blog posts. | ||
| 20 | </p> | ||
| 21 | </section> | ||
| 22 | |||
| 23 | <hr class="border-2 border-gray-100 mb-8"> | ||
| 24 | |||
| 25 | <!-- Dropdown selector to jump to note --> | ||
| 26 | <select id="jump-to-note" class="px-3 py-2 rounded mb-2 bg-gray-100 w-full md:w-auto"> | ||
| 27 | <option>Jump to note</option> | ||
| 28 | </select> | ||
| 29 | |||
| 30 | <!-- List of all notes --> | ||
| 31 | <nav itemscope itemtype="https://schema.org/SiteNavigationElement" class="mb-12" role="feed"> | ||
| 32 | <meta itemprop="name" content="Article list"> | ||
| 33 | <section> | ||
| 34 | {{ range .Pages }} | ||
| 35 | <div class="mb-10"> | ||
| 36 | <article class="mb-5 single note" itemscope itemtype="http://schema.org/Article"> | ||
| 37 | <a href="/{{ .Params.url }}"> | ||
| 38 | <h2 class="text-xl font-medium notes-heading">{{.Title}}</h2> | ||
| 39 | </a> | ||
| 40 | <p class="text-gray-600 _italic text-sm flex flex-col md:flex-row gap-1"> | ||
| 41 | <time datetime="{{ .Date.Format "2006-01-02" }}" itemprop="datePublished"> | ||
| 42 | {{ .Date.Format "Monday Jan 2, 2006" }} | ||
| 43 | </time> | ||
| 44 | |||
| 45 | {{ if .Params.tags }} | ||
| 46 | <span class="hidden md:inline-block"> | ||
| 47 | <span>with tags</span> | ||
| 48 | <span class="inline-flex flex-row gap-1"> | ||
| 49 | <span>(</span> | ||
| 50 | {{ range .Params.tags }} | ||
| 51 | <a href="/tags/{{ . | urlize }}.html">{{ . }}</a> | ||
| 52 | {{ end }} | ||
| 53 | <span>)</span> | ||
| 54 | </span> | ||
| 55 | </span> | ||
| 56 | {{ end }} | ||
| 57 | <div class="content"> | ||
| 58 | {{ .Content | safeHTML }} | ||
| 59 | </div> | ||
| 60 | </article> | ||
| 61 | </div> | ||
| 62 | {{ end }} | ||
| 63 | </section> | ||
| 64 | </nav> | ||
| 65 | |||
| 66 | <script> | ||
| 67 | try { | ||
| 68 | const notes = document.querySelectorAll('h2'); | ||
| 69 | const select = document.querySelector('#jump-to-note'); | ||
| 70 | |||
| 71 | notes.forEach(note => { | ||
| 72 | const id = note.innerText.toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g, ''); | ||
| 73 | note.id = id; | ||
| 74 | note.innerHTML = `<a href="#${id}"></a>${note.innerHTML}`; | ||
| 75 | |||
| 76 | const option = document.createElement('option'); | ||
| 77 | option.value = id; | ||
| 78 | option.innerText = note.innerText; | ||
| 79 | select.appendChild(option); | ||
| 80 | |||
| 81 | select.addEventListener('change', () => { | ||
| 82 | window.location.hash = select.value; | ||
| 83 | }); | ||
| 84 | }); | ||
| 85 | } catch (error) { | ||
| 86 | console.error(error); | ||
| 87 | } | ||
| 88 | </script> | ||
| 89 | |||
| 90 | </main> | ||
| 91 | {{ end }} | ||
