summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-04-07 14:46:20 +0800
committereltrac <hi@eltr.ac>2026-04-07 14:46:20 +0800
commitd733a7aede6421de9f3077b17d7011fadd598241 (patch)
tree6e65401fb82ff0425c7302a984044819a714a370 /static
chore: move templates from geek-death-project
Diffstat (limited to 'static')
-rw-r--r--static/apple-touch-icon.pngbin0 -> 2980 bytes
-rw-r--r--static/atom.xsl.xml37
-rw-r--r--static/favicon.icobin0 -> 200116 bytes
-rw-r--r--static/favicon.pngbin0 -> 2980 bytes
-rw-r--r--static/graph.html80
-rw-r--r--static/icons/codeberg.svg164
-rw-r--r--static/icons/enwiktionary.svg1
-rw-r--r--static/icons/etymonline.jpgbin0 -> 1589 bytes
-rw-r--r--static/icons/external.svg7
-rw-r--r--static/icons/forgejo.svg1
-rw-r--r--static/icons/gatus.svg1
-rw-r--r--static/icons/github.svg19
-rw-r--r--static/icons/music/apple.pngbin0 -> 2819 bytes
-rw-r--r--static/icons/music/bandcamp.pngbin0 -> 1021 bytes
-rw-r--r--static/icons/music/netease.pngbin0 -> 1188 bytes
-rw-r--r--static/icons/music/spotify.pngbin0 -> 2599 bytes
-rw-r--r--static/icons/music/tidal.pngbin0 -> 587 bytes
-rw-r--r--static/icons/rss.svg11
-rw-r--r--static/icons/wikipedia.svg2
-rw-r--r--static/img/bat.svg6
-rw-r--r--static/img/fediverse.pngbin0 -> 98385 bytes
-rw-r--r--static/img/ghost-window.svg59
-rw-r--r--static/img/github.svg2
-rw-r--r--static/img/rss.svg13
-rw-r--r--static/img/thumbs-down.pngbin0 -> 1600 bytes
-rw-r--r--static/js/libra.min.js2
26 files changed, 405 insertions, 0 deletions
diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png
new file mode 100644
index 0000000..04dd134
--- /dev/null
+++ b/static/apple-touch-icon.png
Binary files differ
diff --git a/static/atom.xsl.xml b/static/atom.xsl.xml
new file mode 100644
index 0000000..40604bd
--- /dev/null
+++ b/static/atom.xsl.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom"><xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/><xsl:template match="/"><xsl:variable name="title"><xsl:value-of select="/atom:feed/atom:title"/></xsl:variable><xsl:variable name="description"><xsl:value-of select="/atom:feed/atom:subtitle"/></xsl:variable><xsl:variable name="link"><xsl:value-of select="/atom:feed/atom:link[@rel='alternate']/@href | /atom:feed/atom:link[not(@rel)]/@href"/></xsl:variable><html class="dark scroll-smooth"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="referrer" content="unsafe-url"/><title><xsl:value-of select="$title"/></title><style>*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
+
+ /*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e7e7f0}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#a8a8b8}input::placeholder,textarea::placeholder{opacity:1;color:#a8a8b8}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--card-radius:0.75rem;--btn-radius:var(--card-radius);--badge-radius:var(--btn-radius);--input-radius:var(--btn-radius);--avatar-radius:9999px;--annonce-radius:var(--avatar-radius);--ui-border-color:#1f1f31;--btn-border:#1f1f31;--badge-border:var(--btn-border);--input-border:var(--ui-border-color);--ui-disabled-border:#121220;--ui-error-border:#e11d48;--ui-success-border:#65a30d;--input-outline:#4f46e5;--ui-bg:rgb(18 18 32/var(--ui-bg-opacity));--ui-soft-bg:#1f1f31;--overlay-bg:rgba(2,2,13,.25);--input-bg:var(--ui-soft-bg);--ui-disabled-bg:#121220;--card-padding:1.5rem;--display-text-color:#fff;--title-text-color:var(--display-text-color);--body-text-color:#d6d6e1;--caption-text-color:#6e6e81;--placeholder-text-color:#4d4d5f;--ui-bg-opacity:1;color:var(--body-text-color)}*,.border{border-color:var(--ui-border-color)}button:disabled{border:none!important;background:var(--ui-disabled-bg)!important;background-image:none!important;box-shadow:none!important;color:var(--placeholder-text-color)!important;pointer-events:none!important}button:disabled:before{content:var(--tw-content);display:none}a:focus-visible,button:focus-visible{outline-width:2px;outline-offset:2px;outline-color:#4f46e5}a:focus-visible:focus-visible,button:focus-visible:focus-visible{outline-style:solid}input:user-invalid,select:user-invalid,textarea:user-invalid{--input-border:var(--ui-error-border);--ui-border-color:var(--ui-error-border);--input-outline:var(--ui-error-border);--title-text-color:#fb7185}[data-rounded=none]{--card-radius:0px;--avatar-radius:0px}[data-rounded=default]{--card-radius:0.25rem}[data-rounded=small]{--card-radius:0.125rem}[data-rounded=medium]{--card-radius:0.375rem}[data-rounded=large]{--card-radius:0.5rem}[data-rounded=xlarge]{--card-radius:0.75rem}[data-rounded="2xlarge"]{--card-radius:1rem;--input-radius:0.75rem}[data-rounded="3xlarge"]{--card-radius:1.5rem;--input-radius:0.75rem}[data-rounded=full]{--card-radius:1.5rem;--btn-radius:9999px;--input-radius:1rem}[data-shade=glassy]{--ui-bd-blur:40px;--ui-bg-opacity:0.75;--ui-bg:rgb(58 58 75/var(--ui-bg-opacity));--ui-border-color:rgba(250,250,254,.1);--ui-soft-bg:rgba(77,77,95,.5)}[data-shade="800"]{--ui-border-color:#3a3a4b;--ui-bg:#1f1f31;--ui-soft-bg:#121220}[data-shade="900"]{--ui-border-color:#1f1f31;--ui-bg:#121220;--ui-soft-bg:#1f1f31}[data-shade="950"]{--ui-border-color:#1f1f31;--ui-bg:#02020d;--ui-soft-bg:#1f1f31}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.icon-\[tabler--rss\]{display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 19a1 1 0 1 0 2 0 1 1 0 1 0-2 0M4 4a16 16 0 0 1 16 16M4 11a9 9 0 0 1 9 9'/%3E%3C/svg%3E")}.link{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity,1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.link.variant-ghost:hover,.link.variant-underlined{text-decoration-line:underline}.link.variant-animated{position:relative}.link.variant-animated:before{position:absolute;left:0;right:0;bottom:0;height:1px;transform-origin:right;--tw-scale-x:0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);content:var(--tw-content);transition-duration:.2s}.link.variant-animated:hover:before{transform-origin:left;content:var(--tw-content);--tw-scale-x:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.link.intent-info{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.link.intent-neutral{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.link.variant-animated.intent-neutral:before{content:var(--tw-content);background-color:hsla(0,0%,100%,.5)}.link.variant-animated.intent-info:before{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.link.variant-animated.intent-primary:before{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.link.variant-ghost.intent-neutral,.link.variant-underlined.intent-neutral{text-decoration-color:hsla(0,0%,100%,.5)}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-mt-5{margin-top:-1.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.hidden{display:none}.h-8{height:2rem}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-24{width:6rem}.w-8{width:2rem}.max-w-full{max-width:100%}.max-w-screen-lg{max-width:1024px}.flex-1{flex:1 1 0%}.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-2{row-gap:.5rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.scroll-smooth{scroll-behavior:smooth}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-gray-925{--tw-bg-opacity:1;background-color:rgb(9 9 21/var(--tw-bg-opacity,1))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary-600{--tw-gradient-from:#4f46e5 var(--tw-gradient-from-position);--tw-gradient-to:rgba(79,70,229,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-accent-400{--tw-gradient-to:#e879f9 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1{padding:.25rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-2{padding-bottom:.5rem}.pt-2{padding-top:.5rem}.text-center{text-align:center}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-normal{line-height:1.5}.text-transparent{color:transparent}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.text-title{color:var(--title-text-color)}.text-body{color:var(--body-text-color)}.\!text-caption{color:var(--caption-text-color)!important}.text-caption{color:var(--caption-text-color)}.dark{--display-text-color:#fff;--title-text-color:var(--display-text-color);--caption-text-color:#6e6e81;--body-text-color:#d6d6e1;--placeholder-text-color:#4d4d5f;--ui-border-color:#232323}[data-shade="900"]:where(.dark,.dark *),[data-shade="925"]:where(.dark,.dark *),[data-shade="950"]:where(.dark,.dark *){--ui-border-color:#383838}@media (min-width:640px){.sm\:gap-1{gap:.25rem}}@media (min-width:768px){.md\:flex-row{flex-direction:row}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:p-4{padding:1rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:pt-6{padding-top:1.5rem}}@media (min-width:1024px){.lg\:dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(18 18 32/var(--tw-bg-opacity,1))}}</style></head><body class="bg-gray-925 min-h-screen min-h-svh font-sans leading-normal antialiased lg:dark:bg-gray-900"><main class="min-w-screen container mx-auto flex min-h-screen max-w-screen-lg flex-col px-4 py-6 md:px-6"><header class="space-y-2 pt-2 md:pt-6"><a title="{$title}" href="{$link}" target="_blank" rel="noopener noreferrer"><h1 class="flex text-2xl"><span class="icon-[tabler--rss] mr-2 h-8 w-8"/><span class="lg2:text-3xl from-primary-600 to-accent-400 inline-block bg-gradient-to-r bg-clip-text font-bold text-transparent"><xsl:value-of select="$title" disable-output-escaping="yes"/></span></h1></a><p class="text-body pt-2 text-lg py-4"><xsl:value-of select="$description" disable-output-escaping="yes"/></p><p class="text-caption text-sm">
+ This RSS feed for the
+ <a class="link intent-neutral variant-animated !text-caption font-bold" title="{$title}" href="{$link}" target="_blank" rel="noopener noreferrer"><xsl:value-of select="$title"/></a>
+ website.
+ </p><p class="text-body text-sm hidden" id="subscribe-links">
+ You can subscribe this RSS feed by
+ <a class="link intent-neutral variant-animated font-bold" title="Feedly" data-href="https://feedly.com/i/subscription/feed/" target="_blank" rel="noopener noreferrer">Feedly</a>,
+ <a class="link intent-neutral variant-animated font-bold" title="Inoreader" data-href="https://www.inoreader.com/feed/" target="_blank" rel="noopener noreferrer">Inoreader</a>,
+ <a class="link intent-neutral variant-animated font-bold" title="Newsblur" data-href="https://www.newsblur.com/?url=" target="_blank" rel="noopener noreferrer">Newsblur</a>,
+ <a class="link intent-neutral variant-animated font-bold" title="Follow" data-href="follow://add?url=" rel="noopener noreferrer">Follow</a>,
+ <a class="link intent-neutral variant-animated font-bold" title="RSS Reader" data-href="feed:" data-raw="true" rel="noopener noreferrer">RSS Reader</a>
+ or
+ <a class="link intent-neutral variant-animated font-bold" title="{$title} 's feed source" data-href="" data-raw="true" rel="noopener noreferrer">View Source</a>.
+ </p><script>
+ document.addEventListener('DOMContentLoaded', function () {
+ document.querySelectorAll('a[data-href]').forEach(function (a) {
+ const url = new URL(location.href)
+ const feed = url.searchParams.get('url') || location.href
+ const raw = a.getAttribute('data-raw')
+ if (raw) {
+ a.href = a.getAttribute('data-href') + feed
+ } else {
+ a.href = a.getAttribute('data-href') + encodeURIComponent(feed)
+ }
+ })
+ document.getElementById('subscribe-links').classList.remove('hidden')
+ })
+ </script></header><hr class="my-6"/><section class="flex-1 space-y-6 p-1 md:p-4"><xsl:choose><xsl:when test="/rss/channel/item"><xsl:for-each select="/rss/channel/item"><article class="space-y-2"><details><summary class="max-w-full truncate"><xsl:if test="title"><h2 class="text-title inline cursor-pointer text-lg font-semibold"><xsl:value-of select="title" disable-output-escaping="yes"/></h2></xsl:if><xsl:if test="pubDate"><time class="text-caption ml-4 mt-1 block text-sm"><xsl:value-of select="pubDate"/></time></xsl:if></summary><div class="text-body px-4 py-2"><p class="my-2"><xsl:choose><xsl:when test="description"><xsl:value-of select="description" disable-output-escaping="yes"/></xsl:when></xsl:choose></p><xsl:if test="link"><a class="link variant-animated intent-neutral font-bold" href="{link}" target="_blank" rel="noopener noreferrer">
+ Read More
+ </a></xsl:if></div></details></article></xsl:for-each></xsl:when><xsl:when test="/atom:feed/atom:entry"><xsl:for-each select="/atom:feed/atom:entry"><article class="space-y-2"><details><summary class="max-w-full truncate"><xsl:if test="atom:title"><h2 class="text-title inline cursor-pointer text-lg font-semibold"><xsl:value-of select="atom:title" disable-output-escaping="yes"/></h2></xsl:if><xsl:if test="atom:updated"><time class="text-caption ml-4 mt-1 block text-sm"><xsl:value-of select="atom:updated"/></time></xsl:if></summary><div class="text-body px-4 py-2"><p class="my-2"><xsl:choose><xsl:when test="atom:summary"><xsl:value-of select="atom:summary" disable-output-escaping="yes"/></xsl:when><xsl:when test="atom:content"><xsl:value-of select="atom:content" disable-output-escaping="yes"/></xsl:when></xsl:choose></p><xsl:if test="atom:link/@href"><a class="link variant-animated intent-neutral font-bold" href="{atom:link/@href}" target="_blank" rel="noopener noreferrer">
+ Read More
+ </a></xsl:if></div></details></article></xsl:for-each></xsl:when></xsl:choose></section><hr class="my-6"/><footer><div class="flex flex-col justify-between space-y-4 md:flex-row md:space-y-0"><div class="space-y-4"><a class="flex text-2xl font-bold" href="https://rss.beauty" title="RSS.Beauty"><span class="text-title icon-[tabler--rss] mr-1 h-8 w-8"/><span class="text-title">RSS</span>.
+ <span class="from-primary-600 to-accent-400 bg-gradient-to-r bg-clip-text text-transparent">Beauty</span></a><div class="text-caption">Make Your RSS Beautiful</div></div><div class="space-y-4"><div class="flex flex-wrap gap-x-4 gap-y-2"><a class="link intent-neutral variant-animated" target="_blank" title="GitHub" href="https://github.com/ccbikai/RSS.Beauty">GitHub</a><a class="link intent-neutral variant-animated" target="_blank" title="X/Twitter" href="https://404.li/kai">X/Twitter</a></div><div class="text-title flex gap-1 overflow-hidden font-medium">
+ Made with ❤️‍🔥 By
+ <div class="flex items-start justify-center gap-2 text-center font-semibold sm:gap-1"><div class="block"><a href="https://html.zone" target="_blank" title="HTML.ZONE" class="block pb-2">HTML.ZONE</a><div class="-mt-5 grow overflow-hidden"><svg class="w-24" aria-hidden="true" height="22" viewBox="0 0 283 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.24715 19.3744C72.4051 10.3594 228.122 -4.71194 281.724 7.12332" stroke="url(#paint0_linear_pl)" stroke-width="4"/><defs><linearGradient id="paint0_linear_pl" x1="282" y1="5.49999" x2="40" y2="13" gradientUnits="userSpaceOnUse"><stop stop-color="#facc15"/><stop offset="1" stop-color="#a855f7"/></linearGradient></defs></svg></div></div></div></div></div></div></footer></main></body></html></xsl:template></xsl:stylesheet> \ No newline at end of file
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000..1b11690
--- /dev/null
+++ b/static/favicon.ico
Binary files differ
diff --git a/static/favicon.png b/static/favicon.png
new file mode 100644
index 0000000..04dd134
--- /dev/null
+++ b/static/favicon.png
Binary files differ
diff --git a/static/graph.html b/static/graph.html
new file mode 100644
index 0000000..9cc77cb
--- /dev/null
+++ b/static/graph.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Page Link Graph</title>
+ <script type="text/javascript" src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
+ <style>
+ body {
+ margin: 0;
+ background: #111;
+ color: #eee;
+ font-family: sans-serif;
+ }
+ #graph {
+ width: 100vw;
+ height: 100vh;
+ border: 1px solid #444;
+ }
+ </style>
+</head>
+<body>
+ <div id="graph"></div>
+ <script>
+ fetch("link-graph.json")
+ .then(res => res.json())
+ .then(data => {
+ const container = document.getElementById("graph");
+
+ const nodes = new vis.DataSet(
+ data.nodes.map(node => ({
+ id: node.id,
+ label: node.label,
+ url: node.url,
+ font: { color: "#eee" }
+ }))
+ );
+
+ const edges = new vis.DataSet(data.edges);
+
+ const network = new vis.Network(container, { nodes, edges }, {
+ nodes: {
+ shape: "dot",
+ size: 10,
+ color: {
+ background: "#29c",
+ border: "#fff"
+ },
+ font: {
+ size: 14,
+ color: "#eee"
+ }
+ },
+ edges: {
+ arrows: "to",
+ color: {
+ color: "#888"
+ }
+ },
+ physics: {
+ stabilization: false
+ },
+ interaction: {
+ navigationButtons: true,
+ zoomView: true,
+ dragView: true
+ }
+ });
+
+ network.on("click", function (params) {
+ if (params.nodes.length > 0) {
+ const node = nodes.get(params.nodes[0]);
+ if (node.url) {
+ window.open(node.url, "_blank");
+ }
+ }
+ });
+ });
+ </script>
+</body>
+</html>
diff --git a/static/icons/codeberg.svg b/static/icons/codeberg.svg
new file mode 100644
index 0000000..028b729
--- /dev/null
+++ b/static/icons/codeberg.svg
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="16"
+ height="16"
+ viewBox="0 0 4.2333332 4.2333335"
+ version="1.1"
+ id="svg1468"
+ sodipodi:docname="codeberg-logo_icon_blue.svg"
+ inkscape:version="1.2-alpha1 (b6a15bb, 2022-02-23)"
+ inkscape:export-filename="/home/mray/Projects/Codeberg/logo/icon/png/codeberg-logo_icon_blue.png"
+ inkscape:export-xdpi="384"
+ inkscape:export-ydpi="384"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <title
+ id="title16">Codeberg logo</title>
+ <defs
+ id="defs1462">
+ <linearGradient
+ xlink:href="#linearGradient6924"
+ id="linearGradient6918"
+ x1="42519.285"
+ y1="-7078.7891"
+ x2="42575.336"
+ y2="-6966.9307"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient6924">
+ <stop
+ style="stop-color:#2185d0;stop-opacity:0"
+ offset="0"
+ id="stop6920" />
+ <stop
+ id="stop6926"
+ offset="0.49517274"
+ style="stop-color:#2185d0;stop-opacity:0.48923996" />
+ <stop
+ style="stop-color:#2185d0;stop-opacity:0.63279623"
+ offset="1"
+ id="stop6922" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient6924-6"
+ id="linearGradient6918-3"
+ x1="42519.285"
+ y1="-7078.7891"
+ x2="42575.336"
+ y2="-6966.9307"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient6924-6">
+ <stop
+ style="stop-color:#2185d0;stop-opacity:0;"
+ offset="0"
+ id="stop6920-7" />
+ <stop
+ id="stop6926-5"
+ offset="0.49517274"
+ style="stop-color:#2185d0;stop-opacity:0.30000001;" />
+ <stop
+ style="stop-color:#2185d0;stop-opacity:0.30000001;"
+ offset="1"
+ id="stop6922-3" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ showborder="false"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="22.627417"
+ inkscape:cx="12.948893"
+ inkscape:cy="12.661631"
+ inkscape:document-units="px"
+ inkscape:current-layer="svg1468"
+ inkscape:document-rotation="0"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ units="px"
+ inkscape:snap-global="false"
+ inkscape:snap-page="true"
+ showguides="false"
+ inkscape:window-width="1531"
+ inkscape:window-height="873"
+ inkscape:window-x="69"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2067" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1465">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Codeberg logo</dc:title>
+ <cc:license
+ rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Robert Martinez</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Codeberg and the Codeberg Logo are trademarks of Codeberg e.V.</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:date>2020-04-09</dc:date>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>Codeberg e.V.</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:source>codeberg.org</dc:source>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g370484"
+ inkscape:label="logo"
+ transform="matrix(0.06551432,0,0,0.06551432,-2.232417,-1.431776)">
+ <path
+ id="path6733-5"
+ style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:url(#linearGradient6918-3);fill-opacity:1;stroke:none;stroke-width:3.67846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;stop-color:#000000;stop-opacity:1"
+ d="m 42519.285,-7078.7891 a 0.76086879,0.56791688 0 0 0 -0.738,0.6739 l 33.586,125.8886 a 87.182358,87.182358 0 0 0 39.381,-33.7636 l -71.565,-92.5196 a 0.76086879,0.56791688 0 0 0 -0.664,-0.2793 z"
+ transform="matrix(0.37058478,0,0,0.37058478,-15690.065,2662.0533)"
+ inkscape:label="berg" />
+ <path
+ id="path360787"
+ style="opacity:1;fill:#2185d0;fill-opacity:1;stroke-width:17.0055;paint-order:markers fill stroke;stop-color:#000000"
+ d="m 11249.461,-1883.6961 c -12.74,0 -23.067,10.3275 -23.067,23.0671 0,4.3335 1.22,8.5795 3.522,12.2514 l 19.232,-24.8636 c 0.138,-0.1796 0.486,-0.1796 0.624,0 l 19.233,24.8646 c 2.302,-3.6721 3.523,-7.9185 3.523,-12.2524 0,-12.7396 -10.327,-23.0671 -23.067,-23.0671 z"
+ sodipodi:nodetypes="sccccccs"
+ inkscape:label="sky"
+ transform="matrix(1.4006354,0,0,1.4006354,-15690.065,2662.0533)" />
+ </g>
+</svg>
diff --git a/static/icons/enwiktionary.svg b/static/icons/enwiktionary.svg
new file mode 100644
index 0000000..d239d73
--- /dev/null
+++ b/static/icons/enwiktionary.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="50" height="49"><defs><linearGradient id="a" x1="25.901%" x2="78.681%" y1="14.621%" y2="85.445%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="b" x1="53.425%" x2="49.355%" y1="103.287%" y2="-12.58%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="c" x1="38.724%" x2="39.86%" y1="109.956%" y2="-4.226%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="d" x1="61.506%" x2="26.642%" y1="105.424%" y2="4.847%"><stop offset="0%" stop-color="#D40000"/><stop offset="100%" stop-color="#570000"/></linearGradient><linearGradient id="e" x1="83.793%" x2="16.851%" y1="95.966%" y2="-.27%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="f" x1="82.378%" x2="27.9%" y1="94.24%" y2="-2.503%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="g" x1="88.706%" x2="13.861%" y1="93.708%" y2="12.144%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="h" x1="93.056%" x2="10.841%" y1="68.234%" y2="9.218%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient><linearGradient id="i" x1="47.293%" x2="27.569%" y1="97.686%" y2="-.501%"><stop offset="0%" stop-color="#006"/><stop offset="100%" stop-color="#00004F"/></linearGradient></defs><g fill="none" fill-rule="nonzero" stroke="#000" stroke-width=".2"><path fill="url(#a)" d="m44.747 44.606-4.517-.266a32.603 32.603 0 0 0-.376-2.496c-.203-1.057-.286-1.913-.251-2.568.048-.888.201-1.682.46-2.384-.66-.26-.976-.685-.944-1.274a2.86 2.86 0 0 1 .485-1.486l.218.012c.042.224.118.384.226.48.108.096.34.196.697.3.532.157.776.635.733 1.433-.01.202-.035.362-.074.48a2.81 2.81 0 0 1-.964.13 10.411 10.411 0 0 0-.296 2.045c-.052.97.198 2.15.75 3.539l.25.006c.813-1.446 1.56-3.281 2.242-5.505-.653-.314-.963-.768-.931-1.364.027-.512.19-.965.486-1.36l.219.013c.046.337.186.546.42.625l.502.155c.537.17.787.596.75 1.281a2.441 2.441 0 0 1-.107.63c-.247.07-.55.093-.912.072-.514 2.019-1.199 3.851-2.055 5.498l2.57.151c.296-.89 1.052-2.172 2.266-3.846.309-.417.471-.778.488-1.082.016-.31-.118-.527-.403-.651l-.103-.042c-.528-.234-.778-.601-.751-1.102.03-.565.214-1.066.55-1.5l.21.013c.023.288.15.486.382.596l.443.196c.501.227.735.65.702 1.27-.029.535-.317 1.219-.864 2.05-.548.83-1.04 1.749-1.478 2.754a17.011 17.011 0 0 0-1.023 3.197Z" transform="translate(0 1)"/><path fill="url(#b)" d="m5.983 41.592.205-.137c.278.43.52.662.726.695.205.032.555-.117 1.05-.448l2.3-1.537-.082-.15a.65.65 0 0 0-.268-.265.654.654 0 0 0-.324-.063 63.28 63.28 0 0 0-1.748.203l-2.674.338-1.073-1.796.205-.137c.392.457.831.695 1.318.714.487.02 1.463-.048 2.927-.201.535-.057.935-.03 1.202.078.038-.317.135-.603.29-.857.156-.255.496-.681 1.022-1.28.414-.476.66-.79.737-.941.077-.151.08-.288.007-.41-.068-.114-.213-.226-.434-.336-.213-.105-.356-.22-.431-.345a.6.6 0 0 1-.078-.455.59.59 0 0 1 .258-.372.678.678 0 0 1 .577-.08c.218.058.412.23.582.514.166.278.24.577.22.899-.02.321-.104.597-.25.826-.148.23-.462.625-.944 1.185-.437.506-.722.86-.854 1.062-.132.203-.2.411-.204.625-.004.214.064.439.205.675.048.08.122.178.223.295l2.067-1.381c.495-.331.772-.602.833-.812.06-.21-.034-.541-.283-.992l.205-.137 1.817 3.04-.205.137c-.276-.427-.516-.656-.721-.687-.204-.03-.554.12-1.05.45l-2.065 1.381c.035.112.078.21.128.293.156.26.325.434.508.52.184.086.388.112.612.076.224-.036.652-.156 1.285-.36.68-.221 1.147-.352 1.405-.393.257-.041.53-.003.816.113.287.117.514.316.682.597.162.27.226.524.191.76a.733.733 0 0 1-.317.534.54.54 0 0 1-.428.089.542.542 0 0 1-.356-.272c-.07-.118-.107-.305-.11-.56-.001-.262-.037-.451-.107-.57-.069-.114-.189-.165-.36-.153-.17.013-.54.111-1.106.296-.743.244-1.255.386-1.536.426-.282.04-.566.01-.853-.09a2.364 2.364 0 0 1-.211.736c-.11.23-.423.803-.937 1.715-.494.869-.77 1.476-.831 1.82-.06.344-.012.74.147 1.187l-.205.137-1.073-1.796c.071-.106.445-.73 1.122-1.872l1.116-1.882c.07-.115.131-.256.182-.421.051-.165.022-.34-.088-.524a2.193 2.193 0 0 0-.086-.131l-2.3 1.537c-.494.33-.773.6-.834.809-.061.208.031.536.278.983l-.205.137-1.817-3.04Z" transform="translate(0 1)"/><path fill="url(#c)" d="m32.697 8.445-1.662-1.38-5.847 6.48-1.13-.937 5.847-6.48-.802-.665.807-.894 3.594 2.982-.807.894ZM27.13 6.12c-.625.692-1.367 1.12-2.225 1.284-.858.164-1.72.053-2.584-.332l.296 3.763-1.445-.027-.548-6.706 1.45.021.115 1.404c.005.043.062.11.169.198.526.437 1.183.575 1.97.415.711-.14 1.281-.449 1.711-.926.333-.368.503-.839.512-1.412.01-.617-.193-1.097-.608-1.441-.273-.228-.556-.362-.849-.402a.871.871 0 0 0-.808.286c-.303.335-.23.69.22 1.062.103.085.225.161.367.227l-.756.838c-.205-.08-.445-.232-.718-.46-.437-.362-.662-.792-.675-1.292-.016-.463.147-.884.49-1.264.44-.488 1.014-.709 1.72-.663.664.036 1.276.286 1.836.751.826.686 1.26 1.465 1.3 2.34.032.827-.281 1.606-.94 2.336Z" transform="translate(0 1)"/><path fill="url(#d)" d="m30.274 23.9-.14.228c-.205-.127-.396-.191-.572-.193-.176-.001-.388.069-.635.21-.166.095-.499.361-.998.799l-6.328 5.354-.233-.144 1.47-6.44-5.06 4.221-.21-.13 1.898-8.369c.142-.624.219-.998.23-1.12a.931.931 0 0 0-.104-.544c-.088-.159-.246-.309-.476-.45l.14-.228 2.927 1.808-.14.227-.14-.086c-.206-.127-.394-.175-.563-.144a.542.542 0 0 0-.382.255c-.088.144-.205.526-.35 1.148l-1.316 5.637 3.753-3.165.197-.844.157-.675c.044-.255.064-.492.058-.71a.86.86 0 0 0-.066-.311 1.216 1.216 0 0 0-.193-.34 1.418 1.418 0 0 0-.327-.253l.14-.228 3.078 1.902-.14.227-.21-.13c-.218-.134-.407-.183-.568-.147a.621.621 0 0 0-.397.306c-.129.208-.265.627-.41 1.255L23.1 28.291l4.323-3.66c.483-.403.785-.702.905-.899a.538.538 0 0 0 .078-.316.533.533 0 0 0-.107-.304 1.91 1.91 0 0 0-.524-.442l.14-.228 2.36 1.459Z" transform="translate(0 1)"/><path fill="url(#e)" d="m45.36 18.13-.786.87-.768-.901.769-.875.785.906Zm.784 1.61-.788.853-.78-.904.769-.852.799.903Zm-1.579.19-.778.865-.783-.89.766-.869.795.894Zm.03 6.271-.473-.15a1.692 1.692 0 0 1-.596-.313 2.125 2.125 0 0 1-.437-.54c-.224.123-.412.194-.563.212-.215.025-.502-.02-.861-.133l-.737-.233a3.251 3.251 0 0 1-.662 1.161 2.932 2.932 0 0 1-1.442.915c-.71.2-1.507.16-2.39-.118-.798-.252-1.357-.607-1.677-1.065-.349-.504-.405-1.124-.17-1.86a6.31 6.31 0 0 1 .514-1.17c.215-.382.46-.756.736-1.123a25.9 25.9 0 0 1 .825-1.01l.2.2c-.494.58-.847 1.047-1.06 1.404-.213.356-.371.694-.474 1.014-.184.574-.147 1.067.11 1.477.259.411.715.72 1.37.926.767.242 1.502.303 2.204.183.875-.148 1.422-.567 1.644-1.257.148-.464.215-.927.201-1.391a4.06 4.06 0 0 0-.188-1.1l.954-1.269a4.8 4.8 0 0 1 .084 1.137c-.032.444-.163 1.023-.391 1.736l.737.233c.379.12.67.138.873.054.177-.072.304-.228.381-.47.043-.134.08-.272.11-.413.03-.14.056-.297.08-.468l.374-.341-.12.704c-.058.482-.045.846.039 1.092.092.274.288.458.588.553a.262.262 0 0 0 .245-.034.437.437 0 0 0 .156-.23c.074-.232.092-.5.053-.802a3.259 3.259 0 0 0-.179-.7l.645-.63c.073.415.109.695.107.837-.005.32-.097.758-.276 1.314l-.534 1.668Z" transform="translate(0 1)"/><path fill="url(#f)" d="m9.25 27.302.334.07c-.161.757-.437 1.275-.829 1.555a1.59 1.59 0 0 1-1.3.27 2.095 2.095 0 0 1-1.048-.575c-.31-.303-.502-.98-.575-2.032l-.204-2.957-3.793 4.289-1.75-.365 5.372-5.808c-.028-.902-.146-1.59-.355-2.064s-.532-.757-.97-.848a1.473 1.473 0 0 0-.989.12c-.307.155-.522.447-.645.877l-.334-.07c.168-.7.47-1.228.907-1.58.435-.353.913-.475 1.432-.367.333.07.627.242.881.518s.436.694.546 1.255c.11.562.224 1.701.343 3.419l.174 2.417c.065 1 .21 1.69.436 2.07.225.38.542.613.95.698.691.143 1.164-.154 1.417-.892Z" transform="translate(0 1)"/><path fill="url(#g)" d="M27.698 46.903c-.012-.06-.167-1.646-.345-3.525a652.04 652.04 0 0 0-.35-3.648l-.028-.232-.13.251c-.279.538-.597.911-.776.911-.069 0-.136-.02-.15-.042-.014-.024.054-.224.151-.446.578-1.322 1.008-3.034 1.009-4.016 0-.356.041-.596.102-.596.114 0 1.266.55 1.266.604 0 .034-.082.136-.182.226-.162.147-.199.224-.34.713-.086.3-.149.556-.139.567.01.01.712-.056 1.56-.147l1.54-.167.34-.369c.185-.202.352-.368.369-.368.051 0 .788.603.927.76.072.08.122.175.11.21-.014.045-.353.098-1.215.19-.658.07-1.203.135-1.212.145-.009.01.023.407.07.884.047.476.086.907.086.957.001.083.028.089.31.062l.307-.03.3-.346c.22-.255.317-.335.365-.305.187.12.979.815.991.869.018.078-.048.09-1.245.216-.527.056-.961.105-.965.11a70.03 70.03 0 0 0 .178 1.808c.009.053.073.068.262.06.249-.011.254-.014.575-.371.178-.198.352-.36.387-.36.075.001 1.045.849 1.045.913a.085.085 0 0 1-.034.065c-.02.012-.507.07-1.084.13-.576.059-1.06.12-1.076.137-.034.037.153 2.007.194 2.05.016.017.22.009.454-.019l.424-.05.368-.386c.202-.212.393-.386.425-.386.07 0 1.15.903 1.15.962a.092.092 0 0 1-.04.068c-.02.014-1.163.145-2.538.291-1.374.146-2.51.277-2.522.29-.012.013 0 .235.028.493l.05.47-.142.13c-.127.117-.653.375-.765.375-.024 0-.054-.049-.065-.108Zm1.61-1.935c.334-.038.616-.077.626-.087.02-.021-.167-2.023-.192-2.052-.024-.027-1.326.101-1.377.136-.031.021.128 1.97.168 2.061.01.022.16.011.774-.058Zm-.177-2.58c.289-.029.534-.063.545-.074.03-.03-.137-1.816-.172-1.854-.036-.038-1.34.1-1.381.145-.016.017.009.4.054.849.045.45.083.869.085.93.002.103.018.11.174.086.094-.015.407-.051.695-.081Zm-.342-2.356c.276-.028.543-.06.594-.07l.093-.02-.091-.964c-.086-.907-.097-.964-.184-.963-.232.002-1.275.144-1.305.178-.018.02.005.427.052.903.048.477.087.894.087.927.002.073.11.074.754.01Zm-5.878 5.933c-.231-.288-.3-.408-.3-.525-.001-.152 0-.153.33-.21.497-.088 1.782-.442 2.677-.739.438-.145.813-.253.832-.24.02.013.036.07.035.129 0 .084-.105.166-.535.414-.295.17-1.012.587-1.594.926-.582.34-1.077.617-1.1.617-.025 0-.18-.167-.345-.372Zm-.027-2.61c-.126-.264-.229-.51-.229-.548 0-.037.053-.082.118-.099.17-.045.537-.425.775-.803.221-.35.818-1.621.78-1.66-.012-.014-.091.012-.175.058-.293.16-1.516.694-1.59.694-.073 0-.592-.753-.592-.859 0-.03.1-.106.22-.171.204-.109.234-.15.415-.562.375-.851.703-1.907.92-2.967.07-.334.122-.493.165-.493.103 0 .967.644.968.722 0 .04-.078.13-.174.202-.141.106-.204.209-.325.53-.21.56-.68 1.568-.975 2.094a8.607 8.607 0 0 0-.242.445c.005 0 .347-.053.761-.12.414-.065.77-.119.79-.12.083-.001.624-1.359.624-1.565 0-.18.152-.116.57.238.238.202.433.376.433.386 0 .01-.09.112-.202.227-.13.135-.389.555-.735 1.193-.566 1.046-1 1.775-1.326 2.228-.11.152-.2.283-.2.291 0 .008.488-.057 1.084-.144a21.64 21.64 0 0 1 1.254-.159c.164 0 .17.005.17.164 0 .16-.007.167-.261.241-.658.191-1.855.625-2.268.821-.25.12-.47.217-.49.217-.02 0-.138-.217-.263-.48Zm6.73-6.04a.773.773 0 0 1-.12-.278c-.127-.526-.323-.888-.68-1.258-.172-.18-.23-.275-.23-.38 0-.136.006-.14.181-.115.315.045.909.389 1.244.72.307.305.308.306.308.568 0 .304-.129.572-.345.723-.162.112-.264.118-.358.02Z" transform="translate(0 1)"/><path fill="url(#h)" d="M7.38 12.503c-.11-.052-.288-.181-.698-.51a13.111 13.111 0 0 1-.569-.47c-.01-.016-.012-.037-.005-.046.007-.01.133-.093.28-.185 1.494-.944 2.74-2.04 3.602-3.165 1.05-1.372 1.876-3.052 2.26-4.603.04-.165.083-.326.094-.358l.02-.058.599.292c.33.161.606.304.614.317.026.045-.222.91-.416 1.45-.436 1.212-1.09 2.438-1.804 3.384-.948 1.255-2.069 2.37-3.409 3.388l-.261.199.002.109a.953.953 0 0 1-.018.195c-.017.072-.03.09-.083.108-.05.017-.09.008-.209-.047ZM6.008 7.606c-.992-.297-1.679-.461-2.35-.562a1.082 1.082 0 0 1-.255-.056c-.012-.035.396-1.318.421-1.327.03-.01 1.393.248 1.681.318.33.081 1.357.368 1.376.384.015.014-.413 1.305-.448 1.349-.007.01-.199-.038-.425-.106Zm.607-3.373a18.954 18.954 0 0 0-1.562-.39c-.795-.16-1.132-.24-1.13-.267.001-.058.294-1.245.313-1.27.014-.02.038-.024.08-.016l.742.15c.375.077.795.166.934.2.264.064 1.098.283 1.246.328l.085.025-.015.065a26.89 26.89 0 0 1-.355 1.25c-.01.009-.162-.025-.338-.075Z" transform="translate(0 1)"/><path fill="url(#i)" d="M42.111.305c.109.065.373.29.793.675.138.127.268.228.391.301.355.213.906.52 1.652.923l.922.402c.586.351.817.618.692.798-.05.071-.192.174-.43.31l-.18.125-1.738 1.71c-.087.081-.082.207.016.376.092.178.108.31.049.396-.136.196-.581.069-1.335-.382l-.193-.1-1.086-.584-.873-.472c-.043-.026-.16.038-.348.192l-.25.183-.163.036-.084-.034c-.167-.1.068-.653.705-1.661a.944.944 0 0 1 .063-.113l.735-1.26c.203-.323.315-.528.335-.616.098-.32.018-.634-.239-.943-.152-.18-.208-.314-.168-.401.098-.141.343-.095.734.14ZM41.01 4.314l1.774 1.012c.34.148.616.147.832-.002.167-.122.53-.572 1.089-1.348.174-.252.327-.465.46-.642.1-.129.123-.237.07-.324a.432.432 0 0 0-.135-.115l-2.277-1.33-1.813 2.749Zm-.564 1.945.5.366c.61.422.98.671 1.11.75l1.229.735 1.266.725.021.013.533.186.011.006c.485.29.674.515.565.672-.044.063-.168.138-.373.227a.556.556 0 0 0-.136.085c-.515.492-.79.755-.824.79-.02.044.004.12.073.227.045.083.056.156.032.22a.254.254 0 0 1-.03.065c-.032.047-.095.07-.187.071-.147-.01-.595-.228-1.345-.655l-2.282-1.367c-.232-.14-.424-.099-.577.121l-.4.577c-.223.323-.092.629.394.92l1.244.712.022.013c.616.368.948.562.997.58.043.026.09.048.138.067l.883.278a.83.83 0 0 1 .139.067c.587.351.799.645.635.88-.13.19-.351.19-.663.004l-3.518-2.091-.24-.143c-.622-.374-.937-.74-.944-1.1-.005-.215.082-.451.261-.71l.392-.566c.153-.22.112-.45-.121-.69l-.24-.276a.13.13 0 0 1 .009-.145c.082-.118.306-.072.674.137l.076.046.866.768.12.072c.522.312 1.317.778 2.385 1.395.334.2.615.202.843.005a2.35 2.35 0 0 0 .302-.37c.158-.227.238-.357.24-.389.02-.088-.021-.162-.122-.223l-2.609-1.496a9.198 9.198 0 0 0-.597-.225.873.873 0 0 1-.19-.08c-.174-.105-.373-.351-.595-.74l-.147-.321c-.02-.09-.016-.154.011-.193.033-.048.09-.047.169 0Zm6.825 1.004c-.626.903-1.12 1.386-1.48 1.448l-.17-.001-.032-.02c-.13-.078.043-.469.52-1.172l2.27-3.275.186-.29.008-.011c.172-.264.122-.672-.151-1.224-.196-.384-.28-.624-.255-.72.065-.094.21-.074.435.06.311.187.637.516.977.986.172.226.261.4.266.526.006.081-.033.175-.117.28l-.637.786-1.543 2.227c.167.1.509.227 1.027.381.214.062.386.132.516.21.558.334.76.61.608.83-.147.213-.593.095-1.34-.352l-.882-.545-.206-.124Z" transform="translate(0 1)"/></g></svg> \ No newline at end of file
diff --git a/static/icons/etymonline.jpg b/static/icons/etymonline.jpg
new file mode 100644
index 0000000..27dd47a
--- /dev/null
+++ b/static/icons/etymonline.jpg
Binary files differ
diff --git a/static/icons/external.svg b/static/icons/external.svg
new file mode 100644
index 0000000..e729000
--- /dev/null
+++ b/static/icons/external.svg
@@ -0,0 +1,7 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
+<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000" transform="rotate(45)">
+ <g id="SVGRepo_bgCarrier" stroke-width="0"/>
+ <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
+ <g id="SVGRepo_iconCarrier"> <title/> <g id="Complete"> <g id="arrow-up"> <g> <polyline data-name="Right" fill="none" id="Right-2" points="7 7.5 12 2.5 17 7.5" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/> <line fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" x1="12" x2="12" y1="21.3" y2="4.8"/> </g> </g> </g> </g>
+ </svg> \ No newline at end of file
diff --git a/static/icons/forgejo.svg b/static/icons/forgejo.svg
new file mode 100644
index 0000000..804b05e
--- /dev/null
+++ b/static/icons/forgejo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg> \ No newline at end of file
diff --git a/static/icons/gatus.svg b/static/icons/gatus.svg
new file mode 100644
index 0000000..52cc2b8
--- /dev/null
+++ b/static/icons/gatus.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 89.76 89.75"><defs><style>.cls-1{fill:#3cad4b;}.cls-2{fill:#017400;}.cls-3{fill:#1e9025;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M33.67,65.35a23.35,23.35,0,0,1,.08-41,22.94,22.94,0,0,1,3.8-1.64A23,23,0,0,0,53.6,1C53,0,51,0,44.89,0c-9.08,0-9.21.17-8.81,3.22,1.07,8.12-9.42,12.5-14.45,6-1.94-2.52-2.1-2.52-8.68,4.16-6.22,6.3-6.33,6.28-3.77,8.25a8.09,8.09,0,0,1,2.56,9.53A8.15,8.15,0,0,1,3.08,36C0,35.63,0,35.73,0,45.2.08,53.81,0,54,3.3,53.63A8.06,8.06,0,0,1,9.76,67.52c-3,2.83-2.84,2.61,2.84,8.48,5.43,5.62,6.33,6.73,8.16,5.24L34,68A1.63,1.63,0,0,0,33.67,65.35Z"/><path class="cls-2" d="M85.43,36.13a8.11,8.11,0,0,1-5.27-14.21c2.85-2.5,2.82-2.37-3.55-8.75-4.31-4.31-5.71-5.75-6.87-5.4l-14,14a1.65,1.65,0,0,0,.36,2.61,23.35,23.35,0,0,1-.1,41,24.5,24.5,0,0,1-5.11,2c-8.54,2.28-14.73,9.63-14.73,18.47v1.27c.15,2.54,1.19,2.42,8.06,2.52,9.32.14,9.1.35,9.38-4.66a8.11,8.11,0,0,1,14-5.09c3,3.15,2.39,3.11,8.73-3.14,6.56-6.47,6.86-6.25,3.68-9.14a8.1,8.1,0,0,1,6.06-14.07c3.68.27,3.51.06,3.63-8.09C89.85,36.27,90,36.16,85.43,36.13Z"/><path class="cls-3" d="M41.11,59h8a.76.76,0,0,0,.77-.76V50.43a.76.76,0,0,1,.77-.76h7.84a.78.78,0,0,0,.77-.77V40.84a.77.77,0,0,0-.77-.76H50.7a.76.76,0,0,1-.77-.77V31.47a.76.76,0,0,0-.77-.77h-8a.76.76,0,0,0-.77.77v7.84a.76.76,0,0,1-.77.77H31.73a.77.77,0,0,0-.77.76V48.9a.78.78,0,0,0,.77.77h7.84a.76.76,0,0,1,.77.76v7.85A.76.76,0,0,0,41.11,59Z"/></g></g></svg> \ No newline at end of file
diff --git a/static/icons/github.svg b/static/icons/github.svg
new file mode 100644
index 0000000..2dfec51
--- /dev/null
+++ b/static/icons/github.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg width="800px" height="800px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+ <title>github [#142]</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+
+</defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Dribbble-Light-Preview" transform="translate(-140.000000, -7559.000000)" fill="#000000">
+ <g id="icons" transform="translate(56.000000, 160.000000)">
+ <path d="M94,7399 C99.523,7399 104,7403.59 104,7409.253 C104,7413.782 101.138,7417.624 97.167,7418.981 C96.66,7419.082 96.48,7418.762 96.48,7418.489 C96.48,7418.151 96.492,7417.047 96.492,7415.675 C96.492,7414.719 96.172,7414.095 95.813,7413.777 C98.04,7413.523 100.38,7412.656 100.38,7408.718 C100.38,7407.598 99.992,7406.684 99.35,7405.966 C99.454,7405.707 99.797,7404.664 99.252,7403.252 C99.252,7403.252 98.414,7402.977 96.505,7404.303 C95.706,7404.076 94.85,7403.962 94,7403.958 C93.15,7403.962 92.295,7404.076 91.497,7404.303 C89.586,7402.977 88.746,7403.252 88.746,7403.252 C88.203,7404.664 88.546,7405.707 88.649,7405.966 C88.01,7406.684 87.619,7407.598 87.619,7408.718 C87.619,7412.646 89.954,7413.526 92.175,7413.785 C91.889,7414.041 91.63,7414.493 91.54,7415.156 C90.97,7415.418 89.522,7415.871 88.63,7414.304 C88.63,7414.304 88.101,7413.319 87.097,7413.247 C87.097,7413.247 86.122,7413.234 87.029,7413.87 C87.029,7413.87 87.684,7414.185 88.139,7415.37 C88.139,7415.37 88.726,7417.2 91.508,7416.58 C91.513,7417.437 91.522,7418.245 91.522,7418.489 C91.522,7418.76 91.338,7419.077 90.839,7418.982 C86.865,7417.627 84,7413.783 84,7409.253 C84,7403.59 88.478,7399 94,7399" id="github-[#142]">
+
+</path>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/static/icons/music/apple.png b/static/icons/music/apple.png
new file mode 100644
index 0000000..834dc36
--- /dev/null
+++ b/static/icons/music/apple.png
Binary files differ
diff --git a/static/icons/music/bandcamp.png b/static/icons/music/bandcamp.png
new file mode 100644
index 0000000..652fdd8
--- /dev/null
+++ b/static/icons/music/bandcamp.png
Binary files differ
diff --git a/static/icons/music/netease.png b/static/icons/music/netease.png
new file mode 100644
index 0000000..6f26d9b
--- /dev/null
+++ b/static/icons/music/netease.png
Binary files differ
diff --git a/static/icons/music/spotify.png b/static/icons/music/spotify.png
new file mode 100644
index 0000000..abc5f12
--- /dev/null
+++ b/static/icons/music/spotify.png
Binary files differ
diff --git a/static/icons/music/tidal.png b/static/icons/music/tidal.png
new file mode 100644
index 0000000..41cf7d6
--- /dev/null
+++ b/static/icons/music/tidal.png
Binary files differ
diff --git a/static/icons/rss.svg b/static/icons/rss.svg
new file mode 100644
index 0000000..d569892
--- /dev/null
+++ b/static/icons/rss.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="-143 145 512 512" xml:space="preserve">
+<path d="M113,145c-141.4,0-256,114.6-256,256s114.6,256,256,256s256-114.6,256-256S254.4,145,113,145z M43.1,518.7
+ c-6.2,6.2-14.7,9.9-24.1,9.9c-9.4,0-17.8-3.8-24-9.9c-6.2-6.2-10-14.6-10-23.9c0-9.4,3.8-17.8,10-24s14.6-10,24-10
+ c9.4,0,17.9,3.8,24,10c6.2,6.2,10,14.6,10,24C53,504.2,49.2,512.6,43.1,518.7z M104.8,529c-0.1-32.1-12.5-62.3-35.1-84.9
+ c-22.6-22.6-52.8-35.2-84.7-35.2V360c46.6,0,88.7,19,119.3,49.6c30.6,30.6,49.5,72.8,49.6,119.4H104.8z M192,529
+ c-0.1-114.2-92.8-207.1-206.9-207.1V273c70.6,0,134.5,28.7,180.8,75.1c46.3,46.4,75,110.3,75.1,180.9H192z"/>
+</svg> \ No newline at end of file
diff --git a/static/icons/wikipedia.svg b/static/icons/wikipedia.svg
new file mode 100644
index 0000000..e694aad
--- /dev/null
+++ b/static/icons/wikipedia.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m15.562 19.478-3.07-7.238q-.258.51-1.652 3.182t-2.068 4.057c-.051.006-.11.009-.17.009-.041 0-.082-.002-.122-.005h.005c-.019.001-.04.001-.062.001-.075 0-.15-.006-.222-.018l.008.001q-.854-2.01-2.662-6.114t-2.704-6.209c-.193-.428-.425-.796-.699-1.128l.007.008c-.315-.396-.669-.741-1.063-1.035l-.015-.011c-.287-.248-.653-.411-1.055-.447l-.007-.001q0-.052-.005-.25t-.005-.282h6.073v.521c-.301.018-.582.077-.846.173l.021-.007c-.275.092-.508.246-.692.447l-.001.001c-.104.103-.168.246-.168.403 0 .096.024.187.066.266l-.002-.003q.271.614 2.255 5.2t2.453 5.626q.32-.635 1.458-2.776t1.364-2.578q-.198-.406-1.313-2.926t-1.416-3.073q-.396-.72-2.094-.74v-.523l5.343.01v.49c-.012 0-.026 0-.04 0-.345 0-.667.096-.942.263l.008-.005q-.349.24-.13.72.344.73.906 1.974t.895 1.953q1.146-2.229 1.802-3.781.25-.573-.103-.826c-.34-.178-.742-.282-1.169-.282-.061 0-.121.002-.181.006h.008c.007-.065.011-.14.011-.216 0-.015 0-.03 0-.045v.002-.25q.666 0 1.776-.005l2.834-.015v.51c-.457.016-.882.142-1.253.351l.014-.007c-.382.203-.697.486-.931.828l-.006.009-2.219 4.604q.135.344 1.328 3.021t1.266 2.854l4.594-10.593c-.103-.271-.282-.494-.511-.648l-.005-.003c-.193-.143-.419-.256-.663-.324l-.015-.004c-.17-.043-.369-.071-.572-.08h-.006v-.524l4.792.042.01.021-.01.458c-.965.014-1.782.633-2.089 1.495l-.005.016q-5.482 12.666-5.824 13.447z"/></svg> \ No newline at end of file
diff --git a/static/img/bat.svg b/static/img/bat.svg
new file mode 100644
index 0000000..0ca422e
--- /dev/null
+++ b/static/img/bat.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
+<title>batwings</title>
+<path d="M31.19 2.61c-5.261 1.114-9.712 5.432-11.847 10.719 3.106 2.48 2.088 6.827-0.967 8.402-0.66-0.435-1.451-0.688-2.3-0.688s-1.64 0.254-2.301 0.688c-3.054-1.575-4.073-5.922-0.967-8.402-2.135-5.286-6.587-9.605-11.847-10.719 2.604 2.659 3.284 8.028 0.84 10.906 3.982 0.67 4.724 3.825 4.021 8.579 2.088-1.303 4.657-0.762 6.245 1.913-0.118 0.387-0.182 0.798-0.182 1.224 0 2.314 1.876 4.191 4.191 4.191s4.191-1.876 4.191-4.191c0-0.426-0.064-0.837-0.182-1.225 1.588-2.675 4.157-3.216 6.245-1.913-0.702-4.754 0.039-7.909 4.021-8.579-2.444-2.879-1.765-8.247 0.84-10.906zM17.329 26.543c-1.352 0-2.448-1.096-2.448-2.448s1.096-2.448 2.448-2.448c0.311 0 0.609 0.059 0.882 0.165 0 0 0 0-0 0 0.114 0.044 0.224 0.096 0.329 0.156 0.001 0.001 0.002 0.001 0.003 0.002 0.103 0.059 0.201 0.125 0.293 0.197 0.003 0.003 0.007 0.005 0.011 0.008 0.022 0.017 0.043 0.035 0.064 0.052 0.001 0.001 0.003 0.002 0.004 0.004 0.064 0.054 0.124 0.112 0.182 0.172 0.006 0.006 0.012 0.012 0.018 0.019 0.016 0.017 0.032 0.035 0.048 0.052 0.007 0.008 0.013 0.015 0.020 0.023 0.048 0.056 0.093 0.113 0.136 0.173 0.008 0.011 0.016 0.023 0.024 0.034 0.011 0.016 0.022 0.032 0.033 0.049 0.009 0.013 0.017 0.027 0.026 0.040 0.010 0.016 0.020 0.031 0.029 0.047 0.011 0.018 0.021 0.035 0.031 0.053 0.012 0.021 0.024 0.043 0.035 0.064 0.010 0.020 0.021 0.039 0.030 0.059 0.007 0.014 0.014 0.029 0.020 0.043 0.009 0.019 0.017 0.037 0.025 0.056 0.006 0.014 0.012 0.028 0.018 0.042 0.009 0.022 0.018 0.045 0.027 0.068 0.004 0.011 0.008 0.021 0.012 0.032 0.012 0.032 0.023 0.065 0.033 0.098 0.004 0.012 0.007 0.023 0.010 0.035 0.007 0.024 0.014 0.047 0.020 0.072 0.003 0.013 0.007 0.026 0.010 0.039 0.006 0.025 0.012 0.051 0.018 0.076 0.002 0.011 0.005 0.021 0.007 0.032 0.007 0.036 0.014 0.071 0.019 0.108 0.001 0.008 0.002 0.015 0.003 0.023 0.004 0.029 0.008 0.059 0.011 0.089 0.001 0.012 0.002 0.024 0.004 0.036 0.003 0.027 0.005 0.054 0.006 0.081 0.001 0.012 0.002 0.023 0.002 0.035 0.002 0.038 0.003 0.076 0.003 0.114 0 0.033-0.001 0.065-0.002 0.098-0.001 0.018-0.002 0.035-0.003 0.053-0.078 1.281-1.142 2.297-2.443 2.297z"></path>
+</svg> \ No newline at end of file
diff --git a/static/img/fediverse.png b/static/img/fediverse.png
new file mode 100644
index 0000000..2d1f62e
--- /dev/null
+++ b/static/img/fediverse.png
Binary files differ
diff --git a/static/img/ghost-window.svg b/static/img/ghost-window.svg
new file mode 100644
index 0000000..3a4c0a9
--- /dev/null
+++ b/static/img/ghost-window.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg fill="#000000" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="800px" height="800px" viewBox="0 0 588.12 588.121"
+ xml:space="preserve">
+<g>
+ <g>
+ <path d="M248.965,25.335c0-3.672-2.448-7.038-6.12-7.956c-67.014-16.524-135.558,4.59-202.878-4.896
+ c-7.344-0.918-14.076,9.792-5.814,13.464c48.042,20.808,119.952-0.612,171.36,2.142c34.272,1.53,26.928,20.808,27.54,48.654
+ c-45.9-19.584-95.166-13.77-129.438,26.928c-40.392,48.348-44.676,125.766-36.72,185.13c-26.928,0-48.042-0.612-47.736-2.448
+ c2.754-36.72,3.06-73.746,3.672-110.772c0.612-33.66,0.918-67.32,0.612-100.98c0-15.3,4.59-32.742-7.65-43.758l0,0
+ c-18.666,16.524-8.262,68.238-8.568,90.882c-1.224,57.834-1.53,115.974-5.814,173.502c-0.306,4.896,4.284,8.262,8.568,8.568
+ c74.97,4.59,149.94,0.306,224.91-0.307c3.366,0,7.344-2.447,7.956-6.12C258.757,207.405,249.578,116.217,248.965,25.335z
+ M235.195,207.099h-0.306c-25.092,1.53-67.626-3.366-59.364-39.168c2.448-10.404,10.098-18.666,20.196-21.726
+ c15.3-4.896,26.622,4.284,40.086,7.65C236.113,171.603,235.808,189.351,235.195,207.099z M125.036,288.801
+ c-10.098-7.956-19.278-18.666-20.196-31.824c-0.918-10.098,3.978-19.89,12.546-25.398c9.18-5.508,19.584-2.142,26.928,4.59
+ c14.994,13.158,20.196,33.354,25.398,52.02C161.144,288.189,144.313,288.495,125.036,288.801z M234.89,224.847
+ c-0.612,11.934-1.53,23.868-2.754,35.802c-3.06,30.906-26.622,28.458-47.736,27.54c-6.732-33.354-33.354-92.718-74.052-68.85
+ c-12.24,7.344-18.36,22.338-17.442,36.108c0.918,13.77,8.568,24.786,18.666,33.048c-11.628,0-23.562,0-34.884,0
+ c-1.224-53.244,1.53-106.794,25.398-155.448c27.846-56.304,78.948-58.14,131.58-45.594c0.612,16.218,0.918,32.742,1.53,48.96
+ c-12.546-7.344-31.212-8.568-43.452-4.896c-14.994,4.284-26.316,17.136-30.294,32.13s1.224,31.518,13.158,41.31
+ c16.83,13.77,40.392,14.382,60.588,9.792C234.89,218.421,234.89,221.481,234.89,224.847z"/>
+ <path d="M561.392,17.991C540.89-6.183,485.197,5.445,459.493,8.811c-44.981,6.12-93.023,12.24-136.17,26.928
+ c-1.836,0.612-3.365,2.448-3.978,4.284c-1.53-5.508-10.71-4.896-11.322,1.836c-7.038,82.62,1.836,164.934,2.754,247.554
+ c0,3.672,2.448,7.65,6.426,8.262c80.479,16.523,162.486,11.934,244.188,11.321c3.366,0,7.65-2.447,8.262-6.119
+ c9.486-52.938,16.218-106.183,18.054-160.039C588.932,102.447,589.237,51.039,561.392,17.991z M326.077,229.743
+ c-1.836-37.638-3.978-74.97-5.508-112.302c0.307,0.918,0.918,1.53,1.836,2.142c71.91,37.332,88.435,108.018,123.318,173.808
+ c-18.36-0.306-36.72-0.918-55.08-1.836C335.563,287.883,328.525,281.763,326.077,229.743z M570.571,143.451
+ c-0.611,36.72-4.896,73.746-10.098,110.16c-1.836,12.852-3.979,25.398-6.12,37.944c-0.612,4.59-79.866,2.142-87.516,2.142
+ c-2.143,0-4.591,0-6.732,0c0-0.306,0-0.918-0.306-1.224c-30.294-70.992-57.223-149.022-133.723-181.152
+ c-2.754-1.224-4.896,0.918-5.508,3.366c-0.918-22.644-1.53-45.288-1.224-67.932c0.611,1.224,1.836,2.142,3.672,2.448
+ c39.78,5.508,89.658-15.3,129.132-21.114c24.786-3.672,75.276-14.994,97.002,3.06C576.386,52.263,570.878,112.545,570.571,143.451
+ z"/>
+ <path d="M245.905,351.531c0-2.447-1.53-3.978-3.366-4.896c0.306-4.284-2.142-8.568-7.65-8.874
+ c-74.664-1.836-147.492-14.076-221.544,0c-3.672,0.612-6.12,4.59-6.12,8.262c-0.918,74.97-10.404,149.94-6.12,224.91
+ c0.306,4.896,3.672,8.874,8.874,8.874c74.97,0,149.94,0,224.91-0.306c4.896,0,8.262-3.979,8.568-8.568
+ C248.66,498.105,249.883,424.666,245.905,351.531z M234.89,353.979L234.89,353.979c-0.306,15.606,0.306,68.544-1.53,117.198
+ c-39.168,7.956-72.828-11.322-100.368-37.638c-26.928-25.704-35.496-55.08-48.042-87.211
+ C134.828,345.411,185.624,353.673,234.89,353.979z M218.06,562.365c-21.114,0-199.206,7.956-200.124-8.262
+ c-1.53-24.786-7.956-198.288,16.83-202.878c12.546-2.448,25.092-3.672,37.638-4.284c-0.918,35.802,27.54,73.44,50.49,97.309
+ c28.764,29.987,69.462,47.43,110.466,36.413C230.912,524.421,226.934,562.365,218.06,562.365z"/>
+ <path d="M563.84,368.361c-0.307-4.59-3.673-8.567-8.263-8.262c-69.462,0.918-138.006,8.874-205.938-11.016
+ c-10.404-3.061-14.994,13.157-4.59,16.218c35.189,10.404,69.462,13.77,106.182,14.382c7.344,0,14.382,0,21.726-0.306
+ c-5.201,6.731-7.956,14.993-18.972,15.912c-5.508,0.306-9.792,7.649-4.896,11.934c5.508,4.896,11.628,9.18,18.054,12.546
+ c-7.65,3.978-15.3,8.568-24.174,9.486c-7.344,0.918-9.486,10.71-1.836,13.158c7.956,2.447,29.682,6.426,21.42,17.747
+ c-3.979,5.509-7.65,10.711-11.017,16.524c-41.31,8.262-83.538,12.546-125.153,2.754c-1.225-0.306-2.143-0.306-3.061,0
+ c-0.306-2.754-0.306-5.202-0.611-7.344c-4.284-41.616,3.672-84.456,7.344-126.072c0.611-6.12-9.792-7.649-10.71-1.53
+ c-12.24,70.074-17.748,137.7-0.307,207.469c9.486,37.943,65.484,33.048,94.86,32.742c51.408,0,125.766,3.06,159.732-43.452
+ C602.09,503.001,565.676,410.589,563.84,368.361z M512.126,559.917c-31.213,8.567-65.484,7.956-97.614,8.262
+ c-18.054,0-62.73,4.284-75.582-12.546c-9.486-12.546-12.546-40.086-14.076-61.812c43.146,11.322,89.046,5.814,130.662-8.567
+ c1.836-0.612,2.754-1.836,3.06-3.061c6.427-9.485,18.36-16.83,19.584-28.458c0.918-7.649-6.731-13.158-15.3-17.136
+ c8.874-4.284,17.136-9.18,26.928-10.71c8.263-1.225,5.202-12.853-1.836-13.464c-6.426-0.612-12.239-3.366-18.054-6.732
+ c0.612-0.306,1.53-0.918,2.142-1.53c5.814-4.896,7.345-14.075,13.771-18.359c2.448-1.836,3.366-4.284,3.06-6.732
+ c5.202-0.306,10.099-0.306,15.301-0.611c14.993-0.612,42.84-9.792,44.37,7.649c2.142,24.48,7.344,48.96,11.016,73.44
+ C566.899,508.509,568.124,544.617,512.126,559.917z"/>
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/static/img/github.svg b/static/img/github.svg
new file mode 100644
index 0000000..a285af8
--- /dev/null
+++ b/static/img/github.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" width="800px" height="800px" viewBox="-2.5 0 19 19" xmlns="http://www.w3.org/2000/svg" class="cf-icon-svg"><path d="M9.464 17.178a4.506 4.506 0 0 1-2.013.317 4.29 4.29 0 0 1-2.007-.317.746.746 0 0 1-.277-.587c0-.22-.008-.798-.012-1.567-2.564.557-3.105-1.236-3.105-1.236a2.44 2.44 0 0 0-1.024-1.348c-.836-.572.063-.56.063-.56a1.937 1.937 0 0 1 1.412.95 1.962 1.962 0 0 0 2.682.765 1.971 1.971 0 0 1 .586-1.233c-2.046-.232-4.198-1.023-4.198-4.554a3.566 3.566 0 0 1 .948-2.474 3.313 3.313 0 0 1 .091-2.438s.773-.248 2.534.945a8.727 8.727 0 0 1 4.615 0c1.76-1.193 2.532-.945 2.532-.945a3.31 3.31 0 0 1 .092 2.438 3.562 3.562 0 0 1 .947 2.474c0 3.54-2.155 4.32-4.208 4.548a2.195 2.195 0 0 1 .625 1.706c0 1.232-.011 2.227-.011 2.529a.694.694 0 0 1-.272.587z"/></svg> \ No newline at end of file
diff --git a/static/img/rss.svg b/static/img/rss.svg
new file mode 100644
index 0000000..ffa0ed3
--- /dev/null
+++ b/static/img/rss.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg fill="#000000" height="800px" width="800px" version="1.1" id="XMLID_290_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 24 24" xml:space="preserve">
+<g id="rss">
+ <g>
+ <path d="M5,23c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S7.2,23,5,23z M5,17c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S6.1,17,5,17z
+ M24,19h-2C22,9.6,14.4,2,5,2V0C15.5,0,24,8.5,24,19z M19,19h-2c0-6.6-5.4-12-12-12V5C12.7,5,19,11.3,19,19z M14,19h-2
+ c0-3.9-3.1-7-7-7v-2C10,10,14,14,14,19z"/>
+ </g>
+</g>
+</svg> \ No newline at end of file
diff --git a/static/img/thumbs-down.png b/static/img/thumbs-down.png
new file mode 100644
index 0000000..37fdbaf
--- /dev/null
+++ b/static/img/thumbs-down.png
Binary files differ
diff --git a/static/js/libra.min.js b/static/js/libra.min.js
new file mode 100644
index 0000000..720dfcd
--- /dev/null
+++ b/static/js/libra.min.js
@@ -0,0 +1,2 @@
+let t={selector:"[data-libra]",margin:50,zeroMarginBreakpoint:768,offset:{x:0,y:0},transitionDuration:200,imageCursor:"zoom-in"};class e{constructor(){let e=document.createElement("div");return e.id="libra-overlay",e.classList.add("libra-overlay","libra-hidden"),e.style.transitionDuration=t.transitionDuration+"ms",this.element=e,document.body.appendChild(e),this}show(){this.element.classList.remove("libra-hidden"),this.element.classList.add("libra-visible")}hide(){this.element.classList.remove("libra-visible"),this.element.classList.add("libra-hidden")}}class i{static calculateFinalState(e){let i={},s=t.margin;window.innerWidth<=t.zeroMarginBreakpoint&&(s=0);let n=e.naturalWidth,o=e.naturalHeight,l=n/o,r=window.innerWidth-2*s,a=window.innerHeight-2*s;return i.width=n>r?r:n,i.height=n>r?r/l:o,i.height>a&&(i.height=a,i.width=a*l),i.top=(a-i.height)/2+window.scrollY+s+t.offset.y,i.left=(r-i.width)/2+window.scrollX+s+t.offset.x,i}static transformMatrix(t,e,i){let s=i.width/e.width,n=i.height/e.height,o=e.left+e.width/2,l=e.top+e.height/2,r=i.left+i.width/2,a=i.top+i.height/2;t.style.transform=`matrix(${s}, 0, 0, ${n}, ${r-o}, ${a-l})`}static resetTransformMatrix(t){t.style.transform="matrix(1, 0, 0, 1, 0, 0)"}}class s{isOpen=!1;constructor(t){return this.original=t,this.fetchOriginalPosition(),this.create(t),this}create(e){let i=document.createElement("img");i.src=e.src,i.id=`libra-shadow-${e.id}`,i.classList.add("libra-shadow"),i.style.transitionDuration=t.transitionDuration+"ms",this.element=i,this.positionShadow(),this.placeItself()}fetchOriginalPosition(){let e=this.original.getBoundingClientRect();this.originalPosition={top:e.top+window.scrollY+t.offset.y,left:e.left+window.scrollX+t.offset.x,width:e.width,height:e.height}}positionShadow(){this.element.style.top=this.originalPosition.top+"px",this.element.style.left=this.originalPosition.left+"px",this.element.style.width=this.originalPosition.width+"px",this.element.style.height=this.originalPosition.height+"px"}open(){this.isOpen=!0,this.element.classList.add("open"),this.fetchOriginalPosition(),this.positionShadow(),this.original.style.visibility="hidden",document.body.contains(this.element)||this.placeItself();let t=()=>i.transformMatrix(this.element,this.originalPosition,i.calculateFinalState(this.element));0===this.element.naturalWidth||0===this.element.naturalHeight?this.element.addEventListener("load",t,{once:!0}):t()}close(){this.isOpen=!1,this.element.classList.remove("open"),i.resetTransformMatrix(this.element),setTimeout(()=>{this.original.style.visibility="visible",this.destroyItself()},t.transitionDuration)}placeItself(){document.body.appendChild(this.element)}destroyItself(){document.body.contains(this.element)&&document.body.removeChild(this.element)}}class n{currentImage=null;shadows={};constructor(e){!function t(e,i){for(let s in i)"object"!=typeof i[s]||null===i[s]||Array.isArray(i[s])?e[s]=i[s]:(e[s]||(e[s]={}),t(e[s],i[s]));return e}(t,e),this.initOverlay(),this.initImages(),this.initControls()}initOverlay(){this.overlay=new e,this.overlay.element.addEventListener("click",()=>{this.closeCurrent()})}initImages(){this.images=document.querySelectorAll(t.selector),this.images.forEach(e=>{"IMG"===e.tagName&&(e.id=crypto.randomUUID(),e.style.cursor=t.imageCursor,e.addEventListener("click",()=>this.open(e)))})}initControls(){document.addEventListener("keydown",t=>{("Escape"===t.key||" "===t.key)&&this.closeCurrent()}),document.body.addEventListener("wheel",t=>this.closeCurrent()),document.body.addEventListener("touchmove",t=>this.closeCurrent())}open(t){this.currentImage=t;let e=this.shadows[t.id]||new s(t);this.shadows[t.id]||(this.shadows[t.id]=e),e.open(),this.overlay.show()}close(t){this.currentImage=null,this.shadows[t.id]&&(this.shadows[t.id].close(),this.overlay.hide())}closeCurrent(){this.currentImage&&this.close(this.currentImage)}}export{n as default};
+//# sourceMappingURL=libra.min.js.map