Initial commit

This commit is contained in:
root 2025-07-09 04:03:21 +02:00
commit 977c4221c9
35 changed files with 1559 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
zola

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "themes/ametrine"]
path = themes/ametrine
url = https://codeberg.org/daudix/ametrine.git

204
config.toml Normal file
View file

@ -0,0 +1,204 @@
# The base URL of the site; the only required configuration variable.
base_url = "https://mc.daudix.one"
# The site title and description; used in feeds by default.
title = "Snug Nook Minecraft Server"
description = ""
# The default language; used in feeds.
#default_language = "en"
# The site theme to use.
theme = "ametrine"
# For overriding the default output directory `public`, set it to another value (e.g.: "docs")
output_dir = "public"
# Whether dotfiles at the root level of the output directory are preserved when (re)building the site.
# Enabling this also prevents the deletion of the output folder itself on rebuilds.
#preserve_dotfiles_in_output = false
# When set to "true", the Sass files in the `sass` directory in the site root are compiled.
# Sass files in theme directories are always compiled.
#compile_sass = true
# When set to "true", the generated HTML files are minified.
#minify_html = false
# A list of glob patterns specifying asset files to ignore when the content
# directory is processed. Defaults to none, which means that all asset files are
# copied over to the `public` directory.
# Example:
# ignored_content = ["*.{graphml,xlsx}", "temp.*", "**/build_folder"]
#ignored_content = []
# Similar to ignored_content, a list of glob patterns specifying asset files to
# ignore when the static directory is processed. Defaults to none, which means
# that all asset files are copied over to the `public` directory
#ignored_static = []
# When set to "true", a feed is automatically generated.
generate_feeds = true
# The filenames to use for the feeds. Used as the template filenames, too.
# Defaults to ["atom.xml"], which has a built-in template that renders an Atom 1.0 feed.
# There is also a built-in template "rss.xml" that renders an RSS 2.0 feed.
feed_filenames = [ "atom.xml" ]
# The number of articles to include in the feed. All items are included if
# this limit is not set (the default).
# feed_limit = 20
# When set to "true", files in the `static` directory are hard-linked. Useful for large
# static files. Note that for this to work, both `static` and the
# output directory need to be on the same filesystem. Note that the theme's `static`
# files are always copied, regardless of this setting.
#hard_link_static = false
# The default author for pages
author = "SNMC"
# The taxonomies to be rendered for the site and their configuration of the default languages
# Example:
# taxonomies = [
# {name = "tags", feed = true}, # each tag will have its own feed
# {name = "tags"}, # you can have taxonomies with the same name in multiple languages
# {name = "categories", paginate_by = 5}, # 5 items per page for a term
# {name = "authors"}, # Basic definition: no feed or pagination
# ]
#
#taxonomies = []
# When set to "true", a search index is built from the pages and section
# content for `default_language`.
build_search_index = true
# Configuration of the Markdown rendering
[markdown]
# When set to "true", all code blocks are highlighted.
highlight_code = true
# A list of directories used to search for additional `.sublime-syntax` and `.tmTheme` files.
#extra_syntaxes_and_themes = []
# The theme to use for code highlighting.
# See below for list of allowed values.
highlight_theme = "dracula"
# When set to "true", emoji aliases translated to their corresponding
# Unicode emoji equivalent in the rendered Markdown files. (e.g.: :smile: => 😄)
render_emoji = true
# Whether external links are to be opened in a new tab
# If this is true, a `rel="noopener"` will always automatically be added for security reasons
#external_links_target_blank = false
# Whether to set rel="nofollow" for all external links
#external_links_no_follow = false
# Whether to set rel="noreferrer" for all external links
#external_links_no_referrer = false
# Whether smart punctuation is enabled (changing quotes, dashes, dots in their typographic form)
# For example, `...` into `…`, `"quote"` into `“curly”` etc
smart_punctuation = true
# Whether to set decoding="async" and loading="lazy" for all images
# When turned on, the alt text must be plain text.
# For example, `![xx](...)` is ok but `![*x*x](...)` isnt ok
#lazy_async_image = false
# Configuration of the link checker.
#[link_checker]
# Skip link checking for external URLs that start with these prefixes
#skip_prefixes = [
# "http://[2001:db8::]/",
#]
# Skip anchor checking for external URLs that start with these prefixes
#skip_anchor_prefixes = [
# "https://caniuse.com/",
#]
# Treat internal link problems as either "error" or "warn", default is "error"
#internal_level = "warn"
# Treat external link problems as either "error" or "warn", default is "error"
#external_level = "error"
# Various slugification strategies, see below for details
# Defaults to everything being a slug
#[slugify]
#paths = "on"
#taxonomies = "on"
#anchors = "on"
# Whether to remove date prefixes for page path slugs.
# For example, content/posts/2016-10-08_a-post-with-dates.md => posts/a-post-with-dates
# When true, content/posts/2016-10-08_a-post-with-dates.md => posts/2016-10-08-a-post-with-dates
#paths_keep_dates = false
[search]
# Whether to include the title of the page/section in the index
include_title = true
# Whether to include the description of the page/section in the index
include_description = false
# Whether to include the path of the page/section in the index
include_path = false
# Whether to include the rendered content of the page/section in the index
include_content = true
# At which character to truncate the content to. Useful if you have a lot of pages and the index would
# become too big to load on the site. Defaults to not being set.
# truncate_content_length = 100
# Wether to produce the search index as a javascript file or as a JSON file
# Accepted value "elasticlunr_javascript" or "elasticlunr_json"
index_format = "elasticlunr_javascript"
# Optional translation object for the default language
# Example:
# default_language = "fr"
#
# [translations]
# title = "Un titre"
#
[translations]
# Additional languages definition
# You can define language specific config values and translations:
# title, description, generate_feed, feed_filename, taxonomies, build_search_index
# as well as its own search configuration and translations (see above for details on those)
[languages]
# For example
# [languages.fr]
# title = "Mon blog"
# generate_feed = true
# taxonomies = [
# {name = "auteurs"},
# {name = "tags"},
# ]
# build_search_index = false
# You can put any kind of data here. The data
# will be accessible in all templates
# Example:
# [extra]
# author = "Famous author"
#
# author value will be available using {{ config.extra.author }} in templates
#
[extra]
[extra.footer]
show_copyright = true
show_powered_by = true
show_source = true
show_last_updated = true
copyright = "raiz1.noho.st owns this website"
[extra.nav]
icon = "SiteIcon.png"
force_sidebar = true
links = [
{ url = "/", name = "Home", icon = "house" },
]

54
content/_index.md Normal file
View file

@ -0,0 +1,54 @@
+++
title = "Snug Nook Minecraft Server"
description = "Experience the nook in a third dimension."
+++
Thanks to [kevadesu](https://kevadesu.github.io/)'s initiative, we have an official Minecraft server for Snug Nook members. They provided the hosting, configuration, and everything else, while I only provided the subdomain, `mc.daudix.one`.
![Screenshot of Snug Nook Minecraft Server in Minecraft server list. It's description is "The Snug Nook® Experience - Now in Minecraft!"](https://daudix.one/snug-nook/snmc.png#no-hover#pixels)
<style>
img {
border-radius: 0;
}
</style>
## Version
Currently we're running Minecraft <mark>v1.21.1</mark>.
## Access
Access to this server is limited to Snug Nook members only. If you would like to play on this server, join [Snug Nook](https://daudix.one/snug-nook/).
To join:
- In Minecraft, connect to `mc.daudix.one`
- In the [Snug Nook](https://daudix.one/snug-nook/) Discord server, run the command `/register <nickname>` in any channel
- Check your DMs for "RSCC AuthAgents" and click accept.
## Mods/Resource Packs
To improve and make the experience more fun, our server uses a few Fabric mods:
- [Concurrent Chunk Management Engine](https://modrinth.com/mod/c2me-fabric)
- [Distant Horizons](https://modrinth.com/mod/distanthorizons)
- [Incendium](https://modrinth.com/datapack/incendium)
- [No Chat Reports](https://modrinth.com/mod/no-chat-reports)
- [Noisium](https://modrinth.com/mod/noisium)
- [Nullscape](https://modrinth.com/datapack/nullscape)
- [Plasmo Voice](https://modrinth.com/plugin/plasmo-voice)
- [Terralith](https://modrinth.com/datapack/terralith)
You don't need to install any of these to play. However, for the full experience, you can install the following mods:
- [Plasmo Voice](https://modrinth.com/plugin/plasmo-voice)
- [Xaero's Minimap](https://modrinth.com/mod/xaeros-minimap)
And the [Sparkles](https://modrinth.com/resourcepack/sparkles) resource pack.
## Rules
All [Snug Nook rules](https://daudix.one/snug-nook/rules) apply to the in-game chat. Consequences for breaking the rules in the in-game chat are the same as for breaking the rules in any of Snug Nook's chats.
In addition to the above, griefing, turning the server into 2b2t, and overall ruining the fun for everyone, will result in action.

BIN
public/404.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

143
public/404.html Normal file
View file

@ -0,0 +1,143 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" style="--accent-light-h: 324;
--accent-light-s: 2%;
--accent-light-l: 43%;
--accent-dark-h: 0;
--accent-dark-s: 1%;
--accent-dark-l: 75%;
">
<head>
<meta charset="UTF-8" />
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="base" content="https://mc.daudix.one" />
<meta name="generator" content="Zola">
<meta property="og:site_name" content="Snug Nook Minecraft Server" />
<meta property="og:title" content="404 - Snug Nook Minecraft Server" />
<meta property="og:url" content="&#x2F;" />
<meta property="og:description" content="" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="404 - Snug Nook Minecraft Server" />
<meta name="twitter:url" content="&#x2F;" />
<meta name="twitter:description" content="" />
<title>404 - Snug Nook Minecraft Server</title>
<link rel="canonical" href="&#x2F;" />
<link rel="alternate" type="application/atom+xml" href="https://mc.daudix.one/atom.xml" /><link rel="preload" href="https://mc.daudix.one/fonts/geist.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-italic.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-mono.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-mono-italic.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link type="text/css" rel="stylesheet" href="https://mc.daudix.one/style.css?h=e60d57f467e5e5cba5a4" />
<script type="text/javascript" defer src="https://mc.daudix.one/closable.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/search_index.en.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/search.js"></script></head>
<body >
<span id="up" class="hidden"></span>
<span id="down" class="hidden"></span>
<span id="left" class="hidden"></span>
<span id="right" class="hidden"></span>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-nav">
<a id="nav-header" class="has-icon" href="#top"><img class="transparent no-hover" src="https:&#x2F;&#x2F;mc.daudix.one&#x2F;SiteIcon.png" /><div>
<span>404</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a href="https:&#x2F;&#x2F;mc.daudix.one&#x2F;#up" ><i class="icon house" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M222.14%2C105.85l-80-80a20%2C20%2C0%2C0%2C0-28.28%2C0l-80%2C80A19.86%2C19.86%2C0%2C0%2C0%2C28%2C120v96a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V164h24v52a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V120A19.86%2C19.86%2C0%2C0%2C0%2C222.14%2C105.85ZM204%2C204H164V152a12%2C12%2C0%2C0%2C0-12-12H104a12%2C12%2C0%2C0%2C0-12%2C12v52H52V121.65l76-76%2C76%2C76Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i>Snug Nook Minecraft Server</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;mc.daudix.one#up" class=""><i class="icon house" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M222.14%2C105.85l-80-80a20%2C20%2C0%2C0%2C0-28.28%2C0l-80%2C80A19.86%2C19.86%2C0%2C0%2C0%2C28%2C120v96a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V164h24v52a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V120A19.86%2C19.86%2C0%2C0%2C0%2C222.14%2C105.85ZM204%2C204H164V152a12%2C12%2C0%2C0%2C0-12-12H104a12%2C12%2C0%2C0%2C0-12%2C12v52H52V121.65l76-76%2C76%2C76Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i>Home</a>
</li>
</ul>
</nav>
<ul id="nav-buttons">
<li>
<input class="visually-hidden" id="expand-sidebar" type="checkbox" name="expand-sidebar" autocomplete="off" />
<label for="expand-sidebar" title="Toggle Sidebar"><i class="icon sidebar" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216%2C36H40A20%2C20%2C0%2C0%2C0%2C20%2C56V200a20%2C20%2C0%2C0%2C0%2C20%2C20H216a20%2C20%2C0%2C0%2C0%2C20-20V56A20%2C20%2C0%2C0%2C0%2C216%2C36ZM44%2C104H72v20H44ZM72%2C60V80H44V60ZM44%2C148H72v48H44Zm168%2C48H96V60H212Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></label>
</li><li>
<details class="closable">
<summary title="Feed"><i class="icon rss-simple" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C192a12%2C12%2C0%2C0%2C1-24%2C0c0-77.2-62.8-140-140-140a12%2C12%2C0%2C0%2C1%2C0-24C154.43%2C28%2C228%2C101.57%2C228%2C192ZM64%2C100a12%2C12%2C0%2C0%2C0%2C0%2C24%2C68.07%2C68.07%2C0%2C0%2C1%2C68%2C68%2C12%2C12%2C0%2C0%2C0%2C24%2C0A92.1%2C92.1%2C0%2C0%2C0%2C64%2C100Zm4%2C72a16%2C16%2C0%2C1%2C0%2C16%2C16A16%2C16%2C0%2C0%2C0%2C68%2C172Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></summary>
<ul class="dropdown"><a href="https://mc.daudix.one/atom.xml">Atom</a></ul>
</details>
</li><li>
<button id="search" title="Search"><i class="icon magnifying-glass" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M232.49%2C215.51%2C185%2C168a92.12%2C92.12%2C0%2C1%2C0-17%2C17l47.53%2C47.54a12%2C12%2C0%2C0%2C0%2C17-17ZM44%2C112a68%2C68%2C0%2C1%2C1%2C68%2C68A68.07%2C68.07%2C0%2C0%2C1%2C44%2C112Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></button>
</li></ul>
</div>
<main id="main-content" class="has-nav"><div class="container">
<img id="not-found" class="pixels transparent no-hover drop-shadow" alt="404"src="https://mc.daudix.one/404.gif">
<h1>Page Not Found</h1>
<p>The requested page could not be found. Please check that the URL is correct and does not contain any typos.</p>
<div class="buttons">
<a href="https:&#x2F;&#x2F;mc.daudix.one&#x2F;">Go Home</a>
</div>
</div>
</main>
<footer id="site-footer">
<div class="container">
<div><p class="copyright">raiz1.noho.st owns this website
</p>
<p>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://ametrine.daudix.one" rel="">Ametrine</a>
</p>
</div></div>
</footer>
<div id="search-modal">
<div id="search-modal-content">
<label for="search-input" class="visually-hidden">Search</label>
<div>
<input id="search-input" placeholder="Search for…" autocomplete="off" type="search">
<div title="Press “&#x2F;” to Open Search Bar"><i class="icon keyboard" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M224%2C44H32A20%2C20%2C0%2C0%2C0%2C12%2C64V192a20%2C20%2C0%2C0%2C0%2C20%2C20H224a20%2C20%2C0%2C0%2C0%2C20-20V64A20%2C20%2C0%2C0%2C0%2C224%2C44Zm-4%2C144H36V68H220ZM52%2C128a12%2C12%2C0%2C0%2C1%2C12-12H192a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C128Zm0-36A12%2C12%2C0%2C0%2C1%2C64%2C80H192a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C92Zm0%2C72a12%2C12%2C0%2C0%2C1%2C12-12h8a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C164Zm108%2C0a12%2C12%2C0%2C0%2C1-12%2C12H108a12%2C12%2C0%2C0%2C1%2C0-24h40A12%2C12%2C0%2C0%2C1%2C160%2C164Zm44%2C0a12%2C12%2C0%2C0%2C1-12%2C12h-8a12%2C12%2C0%2C0%2C1%2C0-24h8A12%2C12%2C0%2C0%2C1%2C204%2C164Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></div>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
<style>
:root {
--icon-arrow-square-out: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C104a12%2C12%2C0%2C0%2C1-24%2C0V69l-59.51%2C59.51a12%2C12%2C0%2C0%2C1-17-17L187%2C52H152a12%2C12%2C0%2C0%2C1%2C0-24h64a12%2C12%2C0%2C0%2C1%2C12%2C12Zm-44%2C24a12%2C12%2C0%2C0%2C0-12%2C12v64H52V84h64a12%2C12%2C0%2C0%2C0%2C0-24H48A20%2C20%2C0%2C0%2C0%2C28%2C80V208a20%2C20%2C0%2C0%2C0%2C20%2C20H176a20%2C20%2C0%2C0%2C0%2C20-20V140A12%2C12%2C0%2C0%2C0%2C184%2C128Z%22/%3E%3C/svg%3E');;
--icon-caret-down: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216.49%2C104.49l-80%2C80a12%2C12%2C0%2C0%2C1-17%2C0l-80-80a12%2C12%2C0%2C0%2C1%2C17-17L128%2C159l71.51-71.52a12%2C12%2C0%2C0%2C1%2C17%2C17Z%22/%3E%3C/svg%3E');;
--icon-check-square-offset: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C48V208a20%2C20%2C0%2C0%2C1-20%2C20H140a12%2C12%2C0%2C0%2C1%2C0-24h64V52H52v88a12%2C12%2C0%2C0%2C1-24%2C0V48A20%2C20%2C0%2C0%2C1%2C48%2C28H208A20%2C20%2C0%2C0%2C1%2C228%2C48ZM128.49%2C151.51a12%2C12%2C0%2C0%2C0-17%2C0L64%2C199%2C48.49%2C183.51a12%2C12%2C0%2C1%2C0-17%2C17l24%2C24a12%2C12%2C0%2C0%2C0%2C17%2C0l56-56A12%2C12%2C0%2C0%2C0%2C128.49%2C151.51Z%22/%3E%3C/svg%3E');;
--icon-check: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M232.49%2C80.49l-128%2C128a12%2C12%2C0%2C0%2C1-17%2C0l-56-56a12%2C12%2C0%2C1%2C1%2C17-17L96%2C183%2C215.51%2C63.51a12%2C12%2C0%2C0%2C1%2C17%2C17Z%22/%3E%3C/svg%3E');;
--icon-copy: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216%2C28H88A12%2C12%2C0%2C0%2C0%2C76%2C40V76H40A12%2C12%2C0%2C0%2C0%2C28%2C88V216a12%2C12%2C0%2C0%2C0%2C12%2C12H168a12%2C12%2C0%2C0%2C0%2C12-12V180h36a12%2C12%2C0%2C0%2C0%2C12-12V40A12%2C12%2C0%2C0%2C0%2C216%2C28ZM156%2C204H52V100H156Zm48-48H180V88a12%2C12%2C0%2C0%2C0-12-12H100V52H204Z%22/%3E%3C/svg%3E');;
--icon-repeat: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2C128A76.08%2C76.08%2C0%2C0%2C1%2C96%2C52h99l-3.52-3.51a12%2C12%2C0%2C1%2C1%2C17-17l24%2C24a12%2C12%2C0%2C0%2C1%2C0%2C17l-24%2C24a12%2C12%2C0%2C0%2C1-17-17L195%2C76H96a52.06%2C52.06%2C0%2C0%2C0-52%2C52%2C12%2C12%2C0%2C0%2C1-24%2C0Zm204-12a12%2C12%2C0%2C0%2C0-12%2C12%2C52.06%2C52.06%2C0%2C0%2C1-52%2C52H61l3.52-3.51a12%2C12%2C0%2C1%2C0-17-17l-24%2C24a12%2C12%2C0%2C0%2C0%2C0%2C17l24%2C24a12%2C12%2C0%2C1%2C0%2C17-17L61%2C204h99a76.08%2C76.08%2C0%2C0%2C0%2C76-76A12%2C12%2C0%2C0%2C0%2C224%2C116Z%22/%3E%3C/svg%3E');;
--icon-seal-check: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228.75%2C100.05c-3.52-3.67-7.15-7.46-8.34-10.33-1.06-2.56-1.14-7.83-1.21-12.47-.15-10-.34-22.44-9.18-31.27s-21.27-9-31.27-9.18c-4.64-.07-9.91-.15-12.47-1.21-2.87-1.19-6.66-4.82-10.33-8.34C148.87%2C20.46%2C140.05%2C12%2C128%2C12s-20.87%2C8.46-27.95%2C15.25c-3.67%2C3.52-7.46%2C7.15-10.33%2C8.34-2.56%2C1.06-7.83%2C1.14-12.47%2C1.21C67.25%2C37%2C54.81%2C37.14%2C46%2C46S37%2C67.25%2C36.8%2C77.25c-.07%2C4.64-.15%2C9.91-1.21%2C12.47-1.19%2C2.87-4.82%2C6.66-8.34%2C10.33C20.46%2C107.13%2C12%2C116%2C12%2C128S20.46%2C148.87%2C27.25%2C156c3.52%2C3.67%2C7.15%2C7.46%2C8.34%2C10.33%2C1.06%2C2.56%2C1.14%2C7.83%2C1.21%2C12.47.15%2C10%2C.34%2C22.44%2C9.18%2C31.27s21.27%2C9%2C31.27%2C9.18c4.64.07%2C9.91.15%2C12.47%2C1.21%2C2.87%2C1.19%2C6.66%2C4.82%2C10.33%2C8.34C107.13%2C235.54%2C116%2C244%2C128%2C244s20.87-8.46%2C27.95-15.25c3.67-3.52%2C7.46-7.15%2C10.33-8.34%2C2.56-1.06%2C7.83-1.14%2C12.47-1.21%2C10-.15%2C22.44-.34%2C31.27-9.18s9-21.27%2C9.18-31.27c.07-4.64.15-9.91%2C1.21-12.47%2C1.19-2.87%2C4.82-6.66%2C8.34-10.33C235.54%2C148.87%2C244%2C140.05%2C244%2C128S235.54%2C107.13%2C228.75%2C100.05Zm-17.32%2C39.29c-4.82%2C5-10.28%2C10.72-13.19%2C17.76-2.82%2C6.8-2.93%2C14.16-3%2C21.29-.08%2C5.36-.19%2C12.71-2.15%2C14.66s-9.3%2C2.07-14.66%2C2.15c-7.13.11-14.49.22-21.29%2C3-7%2C2.91-12.73%2C8.37-17.76%2C13.19C135.78%2C214.84%2C130.4%2C220%2C128%2C220s-7.78-5.16-11.34-8.57c-5-4.82-10.72-10.28-17.76-13.19-6.8-2.82-14.16-2.93-21.29-3-5.36-.08-12.71-.19-14.66-2.15s-2.07-9.3-2.15-14.66c-.11-7.13-.22-14.49-3-21.29-2.91-7-8.37-12.73-13.19-17.76C41.16%2C135.78%2C36%2C130.4%2C36%2C128s5.16-7.78%2C8.57-11.34c4.82-5%2C10.28-10.72%2C13.19-17.76%2C2.82-6.8%2C2.93-14.16%2C3-21.29C60.88%2C72.25%2C61%2C64.9%2C63%2C63s9.3-2.07%2C14.66-2.15c7.13-.11%2C14.49-.22%2C21.29-3%2C7-2.91%2C12.73-8.37%2C17.76-13.19C120.22%2C41.16%2C125.6%2C36%2C128%2C36s7.78%2C5.16%2C11.34%2C8.57c5%2C4.82%2C10.72%2C10.28%2C17.76%2C13.19%2C6.8%2C2.82%2C14.16%2C2.93%2C21.29%2C3%2C5.36.08%2C12.71.19%2C14.66%2C2.15s2.07%2C9.3%2C2.15%2C14.66c.11%2C7.13.22%2C14.49%2C3%2C21.29%2C2.91%2C7%2C8.37%2C12.73%2C13.19%2C17.76%2C3.41%2C3.56%2C8.57%2C8.94%2C8.57%2C11.34S214.84%2C135.78%2C211.43%2C139.34ZM176.49%2C95.51a12%2C12%2C0%2C0%2C1%2C0%2C17l-56%2C56a12%2C12%2C0%2C0%2C1-17%2C0l-24-24a12%2C12%2C0%2C1%2C1%2C17-17L112%2C143l47.51-47.52A12%2C12%2C0%2C0%2C1%2C176.49%2C95.51Z%22/%3E%3C/svg%3E');;
--icon-speaker-high: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.13V93.87l48-37.33ZM212%2C128a44%2C44%2C0%2C0%2C1-11%2C29.11%2C12%2C12%2C0%2C1%2C1-18-15.88%2C20%2C20%2C0%2C0%2C0%2C0-26.43%2C12%2C12%2C0%2C0%2C1%2C18-15.86A43.94%2C43.94%2C0%2C0%2C1%2C212%2C128Zm40%2C0a83.87%2C83.87%2C0%2C0%2C1-21.39%2C56%2C12%2C12%2C0%2C0%2C1-17.89-16%2C60%2C60%2C0%2C0%2C0%2C0-80%2C12%2C12%2C0%2C1%2C1%2C17.88-16A83.87%2C83.87%2C0%2C0%2C1%2C252%2C128Z%22/%3E%3C/svg%3E');;
--icon-speaker-low: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.13V93.87l48-37.33ZM212%2C128a44%2C44%2C0%2C0%2C1-11%2C29.11%2C12%2C12%2C0%2C0%2C1-18-15.88%2C20%2C20%2C0%2C0%2C0%2C0-26.44%2C12%2C12%2C0%2C0%2C1%2C18-15.85A43.94%2C43.94%2C0%2C0%2C1%2C212%2C128Z%22/%3E%3C/svg%3E');;
--icon-speaker-none: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.12V93.88l48-37.34Z%22/%3E%3C/svg%3E');;
--icon-star: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M243%2C96a20.33%2C20.33%2C0%2C0%2C0-17.74-14l-56.59-4.57L146.83%2C24.62a20.36%2C20.36%2C0%2C0%2C0-37.66%2C0L87.35%2C77.44%2C30.76%2C82A20.45%2C20.45%2C0%2C0%2C0%2C19.1%2C117.88l43.18%2C37.24-13.2%2C55.7A20.37%2C20.37%2C0%2C0%2C0%2C79.57%2C233L128%2C203.19%2C176.43%2C233a20.39%2C20.39%2C0%2C0%2C0%2C30.49-22.15l-13.2-55.7%2C43.18-37.24A20.43%2C20.43%2C0%2C0%2C0%2C243%2C96ZM172.53%2C141.7a12%2C12%2C0%2C0%2C0-3.84%2C11.86L181.58%2C208l-47.29-29.08a12%2C12%2C0%2C0%2C0-12.58%2C0L74.42%2C208l12.89-54.4a12%2C12%2C0%2C0%2C0-3.84-11.86L41.2%2C105.24l55.4-4.47a12%2C12%2C0%2C0%2C0%2C10.13-7.38L128%2C41.89l21.27%2C51.5a12%2C12%2C0%2C0%2C0%2C10.13%2C7.38l55.4%2C4.47Z%22/%3E%3C/svg%3E');;
}
</style>
</body>
</html>

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

9
public/audio-button.js Normal file
View file

@ -0,0 +1,9 @@
const audioButtons = document.querySelectorAll(".audio");
audioButtons.forEach(button => {
button.addEventListener("click", event => playAudio(button.dataset.audio));
});
function playAudio(url) {
new Audio(url).play();
}

BIN
public/card.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

34
public/closable.js Normal file
View file

@ -0,0 +1,34 @@
const closable = document.querySelectorAll("details.closable");
closable.forEach((detail) => {
detail.addEventListener("toggle", () => {
if (detail.open) setTargetDetail(detail);
});
});
function setTargetDetail(targetDetail) {
closable.forEach((detail) => {
if (detail !== targetDetail) {
detail.open = false;
}
});
}
document.addEventListener("click", function (event) {
const isClickInsideDetail = [...closable].some((detail) =>
detail.contains(event.target)
);
if (!isClickInsideDetail) {
closable.forEach((detail) => {
detail.open = false;
});
}
});
const expandSidebar = document.getElementById("expand-sidebar");
const mainContent = document.getElementById("main-content");
mainContent.addEventListener("click", () => {
if (expandSidebar.checked) expandSidebar.checked = false;
});

420
public/comments.js Normal file
View file

@ -0,0 +1,420 @@
// Based on https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/
// Attachment, card, and spoiler code is from https://github.com/cassidyjames/cassidyjames.github.io/blob/99782788a7e3ba3cc52d6803010873abd1b02b9e/_includes/comments.html#L251-L296
let lazyAsyncImage = document.getElementById("lazy-async-image").textContent;
let relAttributes = document.getElementById("rel-attributes").textContent;
let dateLocale = document.getElementById("date-locale").textContent;
let host = document.getElementById("host").textContent;
let user = document.getElementById("user").textContent;
let id = document.getElementById("id").textContent;
let articleAuthorText = document.getElementById("article-author-text").textContent;
let loadingText = document.getElementById("loading-text").textContent;
let noCommentsText = document.getElementById("no-comments-text").textContent;
let reloadText = document.getElementById("reload-text").textContent;
let sensitiveText = document.getElementById("sensitive-text").textContent;
document.getElementById("load-comments").addEventListener("click", loadComments);
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#x27;");
}
function emojify(input, emojis) {
let output = input;
emojis.forEach((emoji) => {
let picture = document.createElement("picture");
let source = document.createElement("source");
source.setAttribute("srcset", escapeHtml(emoji.url));
source.setAttribute("media", "(prefers-reduced-motion: no-preference)");
let img = document.createElement("img");
img.className = "emoji";
img.setAttribute("src", escapeHtml(emoji.static_url));
img.setAttribute("title", `:${emoji.shortcode}:`);
img.setAttribute("width", "24");
img.setAttribute("height", "24");
if (lazyAsyncImage == "true") {
img.setAttribute("decoding", "async");
img.setAttribute("loading", "lazy");
}
picture.appendChild(source);
picture.appendChild(img);
output = output.replace(`:${emoji.shortcode}:`, picture.outerHTML);
});
return output;
}
function loadComments() {
let commentsWrapper = document.getElementById("comments-wrapper");
commentsWrapper.innerHTML = "";
let loadCommentsButton = document.getElementById("load-comments");
loadCommentsButton.innerHTML = loadingText;
loadCommentsButton.disabled = true;
fetch(`https://${host}/api/v1/statuses/${id}/context`)
.then(function (response) {
return response.json();
})
.then(function (data) {
let descendants = data["descendants"];
if (
descendants &&
Array.isArray(descendants) &&
descendants.length > 0
) {
commentsWrapper.innerHTML = "";
descendants.forEach(function (status) {
console.log(descendants);
if (status.account.display_name.length > 0) {
status.account.display_name = escapeHtml(
status.account.display_name
);
status.account.display_name = emojify(
status.account.display_name,
status.account.emojis
);
} else {
status.account.display_name = status.account.username;
}
let instance = "";
if (status.account.acct.includes("@")) {
instance = status.account.acct.split("@")[1];
} else {
instance = host;
}
const isReply = status.in_reply_to_id !== id;
let op = false;
if (status.account.acct == user) {
op = true;
}
status.content = emojify(status.content, status.emojis);
let comment = document.createElement("article");
comment.id = `comment-${status.id}`;
comment.className = isReply ? "comment comment-reply" : "comment";
comment.setAttribute("itemprop", "comment");
comment.setAttribute("itemtype", "http://schema.org/Comment");
let avatarSource = document.createElement("source");
avatarSource.setAttribute(
"srcset",
escapeHtml(status.account.avatar)
);
avatarSource.setAttribute(
"media",
"(prefers-reduced-motion: no-preference)"
);
let avatarImg = document.createElement("img");
avatarImg.className = "avatar";
avatarImg.setAttribute(
"src",
escapeHtml(status.account.avatar_static)
);
avatarImg.setAttribute(
"alt",
`@${status.account.username}@${instance} avatar`
);
if (lazyAsyncImage == "true") {
avatarImg.setAttribute("decoding", "async");
avatarImg.setAttribute("loading", "lazy");
}
let avatarPicture = document.createElement("picture");
avatarPicture.appendChild(avatarSource);
avatarPicture.appendChild(avatarImg);
let avatar = document.createElement("a");
avatar.className = "avatar-link";
avatar.setAttribute("href", status.account.url);
avatar.setAttribute("rel", relAttributes);
avatar.appendChild(avatarPicture);
comment.appendChild(avatar);
let display = document.createElement("a");
display.className = "display";
display.setAttribute("href", status.account.url);
display.setAttribute("rel", relAttributes);
display.setAttribute("itemprop", "author");
display.setAttribute("itemtype", "http://schema.org/Person");
display.innerHTML = status.account.display_name;
let instanceBadge = document.createElement("span");
instanceBadge.className = "instance";
instanceBadge.textContent = `@${status.account.username}@${instance}`;
let permalink = document.createElement("a");
permalink.setAttribute("href", status.url);
permalink.setAttribute("itemprop", "url");
permalink.setAttribute("rel", relAttributes);
permalink.textContent = new Date(
status.created_at
).toLocaleString(dateLocale, {
dateStyle: "long",
timeStyle: "short",
});
let timestamp = document.createElement("time");
timestamp.setAttribute("datetime", status.created_at);
timestamp.classList.add("timestamp");
timestamp.appendChild(permalink);
permalink.classList.add("external");
let header = document.createElement("header");
header.appendChild(display);
header.appendChild(instanceBadge);
header.appendChild(timestamp);
comment.appendChild(header);
let main = document.createElement("main");
main.setAttribute("itemprop", "text");
if (status.sensitive == true || status.spoiler_text != "") {
let summary = document.createElement("summary");
if (status.spoiler_text == "") {
status.spoiler_text == sensitiveText;
}
summary.innerHTML = status.spoiler_text;
let spoiler = document.createElement("details");
spoiler.appendChild(summary);
spoiler.innerHTML += status.content;
main.appendChild(spoiler);
} else {
main.innerHTML = status.content;
}
comment.appendChild(main);
let attachments = status.media_attachments;
let SUPPORTED_MEDIA = ["image", "video", "gifv", "audio"];
let media = document.createElement("div");
media.className = "attachments";
if (
attachments &&
Array.isArray(attachments) &&
attachments.length > 0
) {
attachments.forEach((attachment) => {
if (SUPPORTED_MEDIA.includes(attachment.type)) {
let mediaElement;
switch (attachment.type) {
case "image":
mediaElement = document.createElement("img");
mediaElement.setAttribute("src", attachment.preview_url);
if (attachment.description != null) {
mediaElement.setAttribute("title", attachment.description);
}
if (lazyAsyncImage == "true") {
mediaElement.setAttribute("decoding", "async");
mediaElement.setAttribute("loading", "lazy");
}
if (status.sensitive == true) {
mediaElement.classList.add("spoiler");
}
media.appendChild(mediaElement);
break;
case "video":
mediaElement = document.createElement("video");
mediaElement.setAttribute("src", attachment.url);
mediaElement.setAttribute("controls", "");
if (attachment.description != null) {
mediaElement.setAttribute("title", attachment.description);
}
if (status.sensitive == true) {
mediaElement.classList.add("spoiler");
}
media.appendChild(mediaElement);
break;
case "gifv":
mediaElement = document.createElement("video");
mediaElement.setAttribute("src", attachment.url);
mediaElement.setAttribute("autoplay", "");
mediaElement.setAttribute("playsinline", "");
mediaElement.setAttribute("loop", "");
if (attachment.description != null) {
mediaElement.setAttribute("title", attachment.description);
}
if (status.sensitive == true) {
mediaElement.classList.add("spoiler");
}
media.appendChild(mediaElement);
break;
case "audio":
mediaElement = document.createElement("audio");
mediaElement.setAttribute("src", attachment.url);
mediaElement.setAttribute("controls", "");
if (attachment.description != null) {
mediaElement.setAttribute("title", attachment.description);
}
media.appendChild(mediaElement);
break;
}
let mediaLink = document.createElement("a");
mediaLink.setAttribute("href", attachment.url);
mediaLink.setAttribute("rel", relAttributes);
mediaLink.appendChild(mediaElement);
media.appendChild(mediaLink);
}
});
comment.appendChild(media);
}
let interactions = document.createElement("footer");
let boosts = document.createElement("a");
boosts.className = "boosts";
boosts.setAttribute("href", `${status.url}/reblogs`);
let boostsIcon = document.createElement("i");
boostsIcon.className = "icon";
boosts.appendChild(boostsIcon);
boosts.insertAdjacentHTML('beforeend', ` ${status.reblogs_count}`);
interactions.appendChild(boosts);
let faves = document.createElement("a");
faves.className = "faves";
faves.setAttribute("href", `${status.url}/favourites`);
let favesIcon = document.createElement("i");
favesIcon.className = "icon";
faves.appendChild(favesIcon);
faves.insertAdjacentHTML('beforeend', ` ${status.favourites_count}`);
interactions.appendChild(faves);
if (
status.reactions &&
Array.isArray(status.reactions) &&
status.reactions.length > 0
) {
let reactions = document.createElement("div");
reactions.classList.add("reactions", "overshoot-row");
status.reactions.forEach(reaction => {
let reactionElement = document.createElement("span");
reactionElement.className = "reaction";
if (reaction.url) {
// Custom emoji
let img = document.createElement("img");
img.className = "emoji";
img.setAttribute("src", escapeHtml(reaction.url));
img.setAttribute("title", `${reaction.name}`);
img.setAttribute("width", "24");
img.setAttribute("height", "24");
reactionElement.appendChild(img);
} else {
// Unicode emoji
let emoji = document.createElement("span");
emoji.textContent = reaction.name;
reactionElement.appendChild(emoji);
}
// Append the count
let count = document.createElement("span");
count.textContent = reaction.count;
reactionElement.appendChild(count);
reactions.appendChild(reactionElement);
});
interactions.appendChild(reactions);
}
comment.appendChild(interactions);
if (status.card != null) {
let cardFigure = document.createElement("figure");
if (status.card.image != null) {
let cardImg = document.createElement("img");
cardImg.setAttribute("src", status.card.image);
cardImg.classList.add("no-hover");
cardFigure.appendChild(cardImg);
}
let cardCaption = document.createElement("figcaption");
let cardTitle = document.createElement("strong");
cardTitle.innerHTML = status.card.title;
cardCaption.appendChild(cardTitle);
if (status.card.description != null && status.card.description.length > 0) {
let cardDescription = document.createElement("p");
cardDescription.innerHTML = status.card.description;
cardCaption.appendChild(cardDescription);
}
cardFigure.appendChild(cardCaption);
let card = document.createElement("a");
card.className = "card";
card.setAttribute("href", status.card.url);
card.setAttribute("rel", relAttributes);
card.appendChild(cardFigure);
comment.appendChild(card);
}
if (op === true) {
comment.classList.add("op");
instanceBadge.classList.add("op");
instanceBadge.setAttribute("title", articleAuthorText);
}
commentsWrapper.appendChild(comment);
});
}
else {
var statusText = document.createElement("p");
statusText.innerHTML = noCommentsText;
statusText.setAttribute("id", "comments-status");
commentsWrapper.appendChild(statusText);
}
loadCommentsButton.innerHTML = reloadText;
})
.catch(function (error) {
console.error('Error loading comments:', error);
})
.finally(function () {
loadCommentsButton.disabled = false;
});
}

66
public/copy-button.js Normal file
View file

@ -0,0 +1,66 @@
// Based on https://www.roboleary.net/2022/01/13/copy-code-to-clipboard-blog.html
document.addEventListener("DOMContentLoaded", function () {
let blocks = document.querySelectorAll("pre[class^='language-']");
blocks.forEach((block) => {
if (navigator.clipboard) {
// Code block header title
let title = document.createElement("span");
let lang = block.getAttribute("data-lang");
title.innerHTML = lang;
// Copy button icon
let iconCopy = document.createElement("i");
iconCopy.className = "icon copy";
let iconCheck = document.createElement("i");
iconCheck.className = "icon check";
// Copy button
let button = document.createElement("button");
let copyCodeText = document.getElementById("copy-code-text").textContent;
button.setAttribute("title", copyCodeText);
button.appendChild(iconCopy);
button.appendChild(iconCheck);
// Code block header
let header = document.createElement("div");
header.classList.add("header");
if (block.classList.contains("z-code")) {
header.classList.add("z-code");
}
header.appendChild(title);
header.appendChild(button);
// Container that holds header and the code block itself
let container = document.createElement("div");
container.classList.add("pre-container");
container.appendChild(header);
// Move code block into the container
block.parentNode.insertBefore(container, block);
container.appendChild(block);
button.addEventListener("click", async () => {
await copyCode(block, header, button);
});
}
});
async function copyCode(block, header, button) {
let code = block.querySelector("code");
let text = code.innerText;
await navigator.clipboard.writeText(text);
header.classList.add("active");
button.setAttribute("disabled", true);
header.addEventListener("animationend", () => {
header.classList.remove("active");
button.removeAttribute("disabled");
}, { once: true });
}
});

10
public/elasticlunr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/fonts/geist.woff2 Normal file

Binary file not shown.

171
public/index.html Normal file
View file

@ -0,0 +1,171 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" style="--accent-light-h: 324;
--accent-light-s: 2%;
--accent-light-l: 43%;
--accent-dark-h: 0;
--accent-dark-s: 1%;
--accent-dark-l: 75%;
">
<head>
<meta charset="UTF-8" />
<meta name="description" content="" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="base" content="https://mc.daudix.one" />
<meta name="generator" content="Zola">
<meta property="og:site_name" content="Snug Nook Minecraft Server" />
<meta property="og:title" content="Snug Nook Minecraft Server" />
<meta property="og:url" content="https://mc.daudix.one/" />
<meta property="og:description" content="Experience the nook in a third dimension." />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Snug Nook Minecraft Server" />
<meta name="twitter:url" content="https://mc.daudix.one/" />
<meta name="twitter:description" content="Experience the nook in a third dimension." />
<title>Snug Nook Minecraft Server</title>
<link rel="canonical" href="https://mc.daudix.one/" />
<link rel="alternate" type="application/atom+xml" href="https://mc.daudix.one/atom.xml" /><link rel="preload" href="https://mc.daudix.one/fonts/geist.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-italic.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-mono.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://mc.daudix.one/fonts/geist-mono-italic.woff2?v=1.5.0" as="font" type="font/woff2" crossorigin>
<link type="text/css" rel="stylesheet" href="https://mc.daudix.one/style.css?h=e60d57f467e5e5cba5a4" />
<script type="text/javascript" defer src="https://mc.daudix.one/closable.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/search_index.en.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://mc.daudix.one/search.js"></script></head>
<body >
<span id="up" class="hidden"></span>
<span id="down" class="hidden"></span>
<span id="left" class="hidden"></span>
<span id="right" class="hidden"></span>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-nav">
<a id="nav-header" class="has-icon" href="#top"><img class="transparent no-hover" src="https:&#x2F;&#x2F;mc.daudix.one&#x2F;SiteIcon.png" /><div>
<span>Snug Nook Minecraft Server</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a href="https:&#x2F;&#x2F;mc.daudix.one&#x2F;" class="active"><i class="icon house" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M222.14%2C105.85l-80-80a20%2C20%2C0%2C0%2C0-28.28%2C0l-80%2C80A19.86%2C19.86%2C0%2C0%2C0%2C28%2C120v96a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V164h24v52a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V120A19.86%2C19.86%2C0%2C0%2C0%2C222.14%2C105.85ZM204%2C204H164V152a12%2C12%2C0%2C0%2C0-12-12H104a12%2C12%2C0%2C0%2C0-12%2C12v52H52V121.65l76-76%2C76%2C76Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i>Snug Nook Minecraft Server</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;mc.daudix.one" class=" active"><i class="icon house" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M222.14%2C105.85l-80-80a20%2C20%2C0%2C0%2C0-28.28%2C0l-80%2C80A19.86%2C19.86%2C0%2C0%2C0%2C28%2C120v96a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V164h24v52a12%2C12%2C0%2C0%2C0%2C12%2C12h64a12%2C12%2C0%2C0%2C0%2C12-12V120A19.86%2C19.86%2C0%2C0%2C0%2C222.14%2C105.85ZM204%2C204H164V152a12%2C12%2C0%2C0%2C0-12-12H104a12%2C12%2C0%2C0%2C0-12%2C12v52H52V121.65l76-76%2C76%2C76Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i>Home</a>
</li>
</ul>
</nav>
<ul id="nav-buttons">
<li>
<input class="visually-hidden" id="expand-sidebar" type="checkbox" name="expand-sidebar" autocomplete="off" />
<label for="expand-sidebar" title="Toggle Sidebar"><i class="icon sidebar" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216%2C36H40A20%2C20%2C0%2C0%2C0%2C20%2C56V200a20%2C20%2C0%2C0%2C0%2C20%2C20H216a20%2C20%2C0%2C0%2C0%2C20-20V56A20%2C20%2C0%2C0%2C0%2C216%2C36ZM44%2C104H72v20H44ZM72%2C60V80H44V60ZM44%2C148H72v48H44Zm168%2C48H96V60H212Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></label>
</li><li>
<details class="closable">
<summary title="Feed"><i class="icon rss-simple" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C192a12%2C12%2C0%2C0%2C1-24%2C0c0-77.2-62.8-140-140-140a12%2C12%2C0%2C0%2C1%2C0-24C154.43%2C28%2C228%2C101.57%2C228%2C192ZM64%2C100a12%2C12%2C0%2C0%2C0%2C0%2C24%2C68.07%2C68.07%2C0%2C0%2C1%2C68%2C68%2C12%2C12%2C0%2C0%2C0%2C24%2C0A92.1%2C92.1%2C0%2C0%2C0%2C64%2C100Zm4%2C72a16%2C16%2C0%2C1%2C0%2C16%2C16A16%2C16%2C0%2C0%2C0%2C68%2C172Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></summary>
<ul class="dropdown"><a href="https://mc.daudix.one/atom.xml">Atom</a></ul>
</details>
</li><li>
<button id="search" title="Search"><i class="icon magnifying-glass" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M232.49%2C215.51%2C185%2C168a92.12%2C92.12%2C0%2C1%2C0-17%2C17l47.53%2C47.54a12%2C12%2C0%2C0%2C0%2C17-17ZM44%2C112a68%2C68%2C0%2C1%2C1%2C68%2C68A68.07%2C68.07%2C0%2C0%2C1%2C44%2C112Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></button>
</li></ul>
</div>
<main id="main-content" class="has-nav"><div class="container">
<h1>Snug Nook Minecraft Server</h1><p>Thanks to <a href="https://kevadesu.github.io/">kevadesu</a>s initiative, we have an official Minecraft server for Snug Nook members. They provided the hosting, configuration, and everything else, while I only provided the subdomain, <code>mc.daudix.one</code>.</p>
<p><img src="https://daudix.one/snug-nook/snmc.png#no-hover#pixels" alt="Screenshot of Snug Nook Minecraft Server in Minecraft server list. Its description is “The Snug Nook® Experience - Now in Minecraft!”" /></p>
<style>
img {
border-radius: 0;
}
</style>
<h2 id="version">Version</h2>
<p>Currently were running Minecraft <mark>v1.21.1</mark>.</p>
<h2 id="access">Access</h2>
<p>Access to this server is limited to Snug Nook members only. If you would like to play on this server, join <a href="https://daudix.one/snug-nook/">Snug Nook</a>.</p>
<p>To join:</p>
<ul>
<li>In Minecraft, connect to <code>mc.daudix.one</code></li>
<li>In the <a href="https://daudix.one/snug-nook/">Snug Nook</a> Discord server, run the command <code>/register &lt;nickname&gt;</code> in any channel</li>
<li>Check your DMs for “RSCC AuthAgents” and click accept.</li>
</ul>
<h2 id="mods-resource-packs">Mods/Resource Packs</h2>
<p>To improve and make the experience more fun, our server uses a few Fabric mods:</p>
<ul>
<li><a href="https://modrinth.com/mod/c2me-fabric">Concurrent Chunk Management Engine</a></li>
<li><a href="https://modrinth.com/mod/distanthorizons">Distant Horizons</a></li>
<li><a href="https://modrinth.com/datapack/incendium">Incendium</a></li>
<li><a href="https://modrinth.com/mod/no-chat-reports">No Chat Reports</a></li>
<li><a href="https://modrinth.com/mod/noisium">Noisium</a></li>
<li><a href="https://modrinth.com/datapack/nullscape">Nullscape</a></li>
<li><a href="https://modrinth.com/plugin/plasmo-voice">Plasmo Voice</a></li>
<li><a href="https://modrinth.com/datapack/terralith">Terralith</a></li>
</ul>
<p>You dont need to install any of these to play. However, for the full experience, you can install the following mods:</p>
<ul>
<li><a href="https://modrinth.com/plugin/plasmo-voice">Plasmo Voice</a></li>
<li><a href="https://modrinth.com/mod/xaeros-minimap">Xaeros Minimap</a></li>
</ul>
<p>And the <a href="https://modrinth.com/resourcepack/sparkles">Sparkles</a> resource pack.</p>
<h2 id="rules">Rules</h2>
<p>All <a href="https://daudix.one/snug-nook/rules">Snug Nook rules</a> apply to the in-game chat. Consequences for breaking the rules in the in-game chat are the same as for breaking the rules in any of Snug Nooks chats.</p>
<p>In addition to the above, griefing, turning the server into 2b2t, and overall ruining the fun for everyone, will result in action.</p>
</div>
</main>
<footer id="site-footer">
<div class="container">
<div><p class="copyright">raiz1.noho.st owns this website
</p>
<p>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://ametrine.daudix.one" rel="">Ametrine</a>
</p>
</div></div>
</footer>
<div id="search-modal">
<div id="search-modal-content">
<label for="search-input" class="visually-hidden">Search</label>
<div>
<input id="search-input" placeholder="Search for…" autocomplete="off" type="search">
<div title="Press “&#x2F;” to Open Search Bar"><i class="icon keyboard" style="--icon: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A&#x2F;&#x2F;www.w3.org&#x2F;2000&#x2F;svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M224%2C44H32A20%2C20%2C0%2C0%2C0%2C12%2C64V192a20%2C20%2C0%2C0%2C0%2C20%2C20H224a20%2C20%2C0%2C0%2C0%2C20-20V64A20%2C20%2C0%2C0%2C0%2C224%2C44Zm-4%2C144H36V68H220ZM52%2C128a12%2C12%2C0%2C0%2C1%2C12-12H192a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C128Zm0-36A12%2C12%2C0%2C0%2C1%2C64%2C80H192a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C92Zm0%2C72a12%2C12%2C0%2C0%2C1%2C12-12h8a12%2C12%2C0%2C0%2C1%2C0%2C24H64A12%2C12%2C0%2C0%2C1%2C52%2C164Zm108%2C0a12%2C12%2C0%2C0%2C1-12%2C12H108a12%2C12%2C0%2C0%2C1%2C0-24h40A12%2C12%2C0%2C0%2C1%2C160%2C164Zm44%2C0a12%2C12%2C0%2C0%2C1-12%2C12h-8a12%2C12%2C0%2C0%2C1%2C0-24h8A12%2C12%2C0%2C0%2C1%2C204%2C164Z%22&#x2F;%3E%3C&#x2F;svg%3E');"></i></div>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
<style>
:root {
--icon-arrow-square-out: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C104a12%2C12%2C0%2C0%2C1-24%2C0V69l-59.51%2C59.51a12%2C12%2C0%2C0%2C1-17-17L187%2C52H152a12%2C12%2C0%2C0%2C1%2C0-24h64a12%2C12%2C0%2C0%2C1%2C12%2C12Zm-44%2C24a12%2C12%2C0%2C0%2C0-12%2C12v64H52V84h64a12%2C12%2C0%2C0%2C0%2C0-24H48A20%2C20%2C0%2C0%2C0%2C28%2C80V208a20%2C20%2C0%2C0%2C0%2C20%2C20H176a20%2C20%2C0%2C0%2C0%2C20-20V140A12%2C12%2C0%2C0%2C0%2C184%2C128Z%22/%3E%3C/svg%3E');;
--icon-caret-down: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216.49%2C104.49l-80%2C80a12%2C12%2C0%2C0%2C1-17%2C0l-80-80a12%2C12%2C0%2C0%2C1%2C17-17L128%2C159l71.51-71.52a12%2C12%2C0%2C0%2C1%2C17%2C17Z%22/%3E%3C/svg%3E');;
--icon-check-square-offset: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228%2C48V208a20%2C20%2C0%2C0%2C1-20%2C20H140a12%2C12%2C0%2C0%2C1%2C0-24h64V52H52v88a12%2C12%2C0%2C0%2C1-24%2C0V48A20%2C20%2C0%2C0%2C1%2C48%2C28H208A20%2C20%2C0%2C0%2C1%2C228%2C48ZM128.49%2C151.51a12%2C12%2C0%2C0%2C0-17%2C0L64%2C199%2C48.49%2C183.51a12%2C12%2C0%2C1%2C0-17%2C17l24%2C24a12%2C12%2C0%2C0%2C0%2C17%2C0l56-56A12%2C12%2C0%2C0%2C0%2C128.49%2C151.51Z%22/%3E%3C/svg%3E');;
--icon-check: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M232.49%2C80.49l-128%2C128a12%2C12%2C0%2C0%2C1-17%2C0l-56-56a12%2C12%2C0%2C1%2C1%2C17-17L96%2C183%2C215.51%2C63.51a12%2C12%2C0%2C0%2C1%2C17%2C17Z%22/%3E%3C/svg%3E');;
--icon-copy: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M216%2C28H88A12%2C12%2C0%2C0%2C0%2C76%2C40V76H40A12%2C12%2C0%2C0%2C0%2C28%2C88V216a12%2C12%2C0%2C0%2C0%2C12%2C12H168a12%2C12%2C0%2C0%2C0%2C12-12V180h36a12%2C12%2C0%2C0%2C0%2C12-12V40A12%2C12%2C0%2C0%2C0%2C216%2C28ZM156%2C204H52V100H156Zm48-48H180V88a12%2C12%2C0%2C0%2C0-12-12H100V52H204Z%22/%3E%3C/svg%3E');;
--icon-repeat: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2C128A76.08%2C76.08%2C0%2C0%2C1%2C96%2C52h99l-3.52-3.51a12%2C12%2C0%2C1%2C1%2C17-17l24%2C24a12%2C12%2C0%2C0%2C1%2C0%2C17l-24%2C24a12%2C12%2C0%2C0%2C1-17-17L195%2C76H96a52.06%2C52.06%2C0%2C0%2C0-52%2C52%2C12%2C12%2C0%2C0%2C1-24%2C0Zm204-12a12%2C12%2C0%2C0%2C0-12%2C12%2C52.06%2C52.06%2C0%2C0%2C1-52%2C52H61l3.52-3.51a12%2C12%2C0%2C1%2C0-17-17l-24%2C24a12%2C12%2C0%2C0%2C0%2C0%2C17l24%2C24a12%2C12%2C0%2C1%2C0%2C17-17L61%2C204h99a76.08%2C76.08%2C0%2C0%2C0%2C76-76A12%2C12%2C0%2C0%2C0%2C224%2C116Z%22/%3E%3C/svg%3E');;
--icon-seal-check: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M228.75%2C100.05c-3.52-3.67-7.15-7.46-8.34-10.33-1.06-2.56-1.14-7.83-1.21-12.47-.15-10-.34-22.44-9.18-31.27s-21.27-9-31.27-9.18c-4.64-.07-9.91-.15-12.47-1.21-2.87-1.19-6.66-4.82-10.33-8.34C148.87%2C20.46%2C140.05%2C12%2C128%2C12s-20.87%2C8.46-27.95%2C15.25c-3.67%2C3.52-7.46%2C7.15-10.33%2C8.34-2.56%2C1.06-7.83%2C1.14-12.47%2C1.21C67.25%2C37%2C54.81%2C37.14%2C46%2C46S37%2C67.25%2C36.8%2C77.25c-.07%2C4.64-.15%2C9.91-1.21%2C12.47-1.19%2C2.87-4.82%2C6.66-8.34%2C10.33C20.46%2C107.13%2C12%2C116%2C12%2C128S20.46%2C148.87%2C27.25%2C156c3.52%2C3.67%2C7.15%2C7.46%2C8.34%2C10.33%2C1.06%2C2.56%2C1.14%2C7.83%2C1.21%2C12.47.15%2C10%2C.34%2C22.44%2C9.18%2C31.27s21.27%2C9%2C31.27%2C9.18c4.64.07%2C9.91.15%2C12.47%2C1.21%2C2.87%2C1.19%2C6.66%2C4.82%2C10.33%2C8.34C107.13%2C235.54%2C116%2C244%2C128%2C244s20.87-8.46%2C27.95-15.25c3.67-3.52%2C7.46-7.15%2C10.33-8.34%2C2.56-1.06%2C7.83-1.14%2C12.47-1.21%2C10-.15%2C22.44-.34%2C31.27-9.18s9-21.27%2C9.18-31.27c.07-4.64.15-9.91%2C1.21-12.47%2C1.19-2.87%2C4.82-6.66%2C8.34-10.33C235.54%2C148.87%2C244%2C140.05%2C244%2C128S235.54%2C107.13%2C228.75%2C100.05Zm-17.32%2C39.29c-4.82%2C5-10.28%2C10.72-13.19%2C17.76-2.82%2C6.8-2.93%2C14.16-3%2C21.29-.08%2C5.36-.19%2C12.71-2.15%2C14.66s-9.3%2C2.07-14.66%2C2.15c-7.13.11-14.49.22-21.29%2C3-7%2C2.91-12.73%2C8.37-17.76%2C13.19C135.78%2C214.84%2C130.4%2C220%2C128%2C220s-7.78-5.16-11.34-8.57c-5-4.82-10.72-10.28-17.76-13.19-6.8-2.82-14.16-2.93-21.29-3-5.36-.08-12.71-.19-14.66-2.15s-2.07-9.3-2.15-14.66c-.11-7.13-.22-14.49-3-21.29-2.91-7-8.37-12.73-13.19-17.76C41.16%2C135.78%2C36%2C130.4%2C36%2C128s5.16-7.78%2C8.57-11.34c4.82-5%2C10.28-10.72%2C13.19-17.76%2C2.82-6.8%2C2.93-14.16%2C3-21.29C60.88%2C72.25%2C61%2C64.9%2C63%2C63s9.3-2.07%2C14.66-2.15c7.13-.11%2C14.49-.22%2C21.29-3%2C7-2.91%2C12.73-8.37%2C17.76-13.19C120.22%2C41.16%2C125.6%2C36%2C128%2C36s7.78%2C5.16%2C11.34%2C8.57c5%2C4.82%2C10.72%2C10.28%2C17.76%2C13.19%2C6.8%2C2.82%2C14.16%2C2.93%2C21.29%2C3%2C5.36.08%2C12.71.19%2C14.66%2C2.15s2.07%2C9.3%2C2.15%2C14.66c.11%2C7.13.22%2C14.49%2C3%2C21.29%2C2.91%2C7%2C8.37%2C12.73%2C13.19%2C17.76%2C3.41%2C3.56%2C8.57%2C8.94%2C8.57%2C11.34S214.84%2C135.78%2C211.43%2C139.34ZM176.49%2C95.51a12%2C12%2C0%2C0%2C1%2C0%2C17l-56%2C56a12%2C12%2C0%2C0%2C1-17%2C0l-24-24a12%2C12%2C0%2C1%2C1%2C17-17L112%2C143l47.51-47.52A12%2C12%2C0%2C0%2C1%2C176.49%2C95.51Z%22/%3E%3C/svg%3E');;
--icon-speaker-high: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.13V93.87l48-37.33ZM212%2C128a44%2C44%2C0%2C0%2C1-11%2C29.11%2C12%2C12%2C0%2C1%2C1-18-15.88%2C20%2C20%2C0%2C0%2C0%2C0-26.43%2C12%2C12%2C0%2C0%2C1%2C18-15.86A43.94%2C43.94%2C0%2C0%2C1%2C212%2C128Zm40%2C0a83.87%2C83.87%2C0%2C0%2C1-21.39%2C56%2C12%2C12%2C0%2C0%2C1-17.89-16%2C60%2C60%2C0%2C0%2C0%2C0-80%2C12%2C12%2C0%2C1%2C1%2C17.88-16A83.87%2C83.87%2C0%2C0%2C1%2C252%2C128Z%22/%3E%3C/svg%3E');;
--icon-speaker-low: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.13V93.87l48-37.33ZM212%2C128a44%2C44%2C0%2C0%2C1-11%2C29.11%2C12%2C12%2C0%2C0%2C1-18-15.88%2C20%2C20%2C0%2C0%2C0%2C0-26.44%2C12%2C12%2C0%2C0%2C1%2C18-15.85A43.94%2C43.94%2C0%2C0%2C1%2C212%2C128Z%22/%3E%3C/svg%3E');;
--icon-speaker-none: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.12V93.88l48-37.34Z%22/%3E%3C/svg%3E');;
--icon-star: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M243%2C96a20.33%2C20.33%2C0%2C0%2C0-17.74-14l-56.59-4.57L146.83%2C24.62a20.36%2C20.36%2C0%2C0%2C0-37.66%2C0L87.35%2C77.44%2C30.76%2C82A20.45%2C20.45%2C0%2C0%2C0%2C19.1%2C117.88l43.18%2C37.24-13.2%2C55.7A20.37%2C20.37%2C0%2C0%2C0%2C79.57%2C233L128%2C203.19%2C176.43%2C233a20.39%2C20.39%2C0%2C0%2C0%2C30.49-22.15l-13.2-55.7%2C43.18-37.24A20.43%2C20.43%2C0%2C0%2C0%2C243%2C96ZM172.53%2C141.7a12%2C12%2C0%2C0%2C0-3.84%2C11.86L181.58%2C208l-47.29-29.08a12%2C12%2C0%2C0%2C0-12.58%2C0L74.42%2C208l12.89-54.4a12%2C12%2C0%2C0%2C0-3.84-11.86L41.2%2C105.24l55.4-4.47a12%2C12%2C0%2C0%2C0%2C10.13-7.38L128%2C41.89l21.27%2C51.5a12%2C12%2C0%2C0%2C0%2C10.13%2C7.38l55.4%2C4.47Z%22/%3E%3C/svg%3E');;
}
</style>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

4
public/robots.txt Normal file
View file

@ -0,0 +1,4 @@
User-agent: *
Disallow:
Allow: /
Sitemap: https://mc.daudix.one/sitemap.xml

236
public/search.js Normal file
View file

@ -0,0 +1,236 @@
// Based on https://github.com/cydave/zola-theme-papermod/blob/fab7cd04833f0c78264b433a4fb1f4b999ef0399/static/js/search.js
// Debounce function definition
function debounce(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
// Taken from mdbook
// The strategy is as follows:
// First, assign a value to each word in the document:
// Words that correspond to search terms (stemmer aware): 40
// Normal words: 2
// First word in a sentence: 8
// Then use a sliding window with a constant number of words and count the
// sum of the values of the words within the window. Then use the window that got the
// maximum sum. If there are multiple maximas, then get the last one.
// Enclose the terms in <b>.
function makeTeaser(body, terms) {
var TERM_WEIGHT = 40;
var NORMAL_WORD_WEIGHT = 2;
var FIRST_WORD_WEIGHT = 8;
var TEASER_MAX_WORDS = 30;
var stemmedTerms = terms.map(function (w) {
return elasticlunr.stemmer(w.toLowerCase());
});
var termFound = false;
var index = 0;
var weighted = []; // contains elements of ["word", weight, index_in_document]
// split in sentences, then words
var sentences = body.toLowerCase().split(". ");
for (var i in sentences) {
var words = sentences[i].split(" ");
var value = FIRST_WORD_WEIGHT;
for (var j in words) {
var word = words[j];
if (word.length > 0) {
for (var k in stemmedTerms) {
if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) {
value = TERM_WEIGHT;
termFound = true;
}
}
weighted.push([word, value, index]);
value = NORMAL_WORD_WEIGHT;
}
index += word.length;
index += 1; // ' ' or '.' if last word in sentence
}
index += 1; // because we split at a two-char boundary '. '
}
if (weighted.length === 0) {
return body;
}
var windowWeights = [];
var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS);
// We add a window with all the weights first
var curSum = 0;
for (var i = 0; i < windowSize; i++) {
curSum += weighted[i][1];
}
windowWeights.push(curSum);
for (var i = 0; i < weighted.length - windowSize; i++) {
curSum -= weighted[i][1];
curSum += weighted[i + windowSize][1];
windowWeights.push(curSum);
}
// If we didn't find the term, just pick the first window
var maxSumIndex = 0;
if (termFound) {
var maxFound = 0;
// backwards
for (var i = windowWeights.length - 1; i >= 0; i--) {
if (windowWeights[i] > maxFound) {
maxFound = windowWeights[i];
maxSumIndex = i;
}
}
}
var teaser = [];
var startIndex = weighted[maxSumIndex][2];
for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) {
var word = weighted[i];
if (startIndex < word[2]) {
// missing text from index to start of `word`
teaser.push(body.substring(startIndex, word[2]));
startIndex = word[2];
}
// add <strong> around search terms
if (word[1] === TERM_WEIGHT) {
teaser.push("<strong>");
}
startIndex = word[2] + word[0].length;
teaser.push(body.substring(word[2], startIndex));
if (word[1] === TERM_WEIGHT) {
teaser.push("</strong>");
}
}
teaser.push("…");
return teaser.join("");
}
function formatSearchResultItem(item, terms) {
// Adjust this to match your desired result item structure
return '<div class="item">'
+ `<a href="${item.ref}">${item.doc.title}</a>`
+ `<span>${makeTeaser(item.doc.body, terms)}</span>`
+ '</div>';
}
function initSearch() {
var searchModal = document.getElementById("search-modal"); // Full-screen modal
var searchModalContent = document.getElementById("search-modal-content"); // Actual modal box
var searchInput = document.getElementById("search-input"); // Search input
var searchResults = document.getElementById("search-results"); // Search results
var searchButton = document.getElementById("search"); // Search button
var MAX_ITEMS = 10;
var options = {
bool: "AND",
fields: {
title: { boost: 2 },
body: { boost: 1 },
}
};
var currentTerm = "";
var index;
var initIndex = async function () {
if (index === undefined) {
if (typeof window.searchIndex !== "undefined") {
index = elasticlunr.Index.load(window.searchIndex);
} else {
let response = await fetch(`/search_index.${document.documentElement.lang}.json`);
index = elasticlunr.Index.load(await response.json());
}
}
return index;
};
// Open search modal when clicking the search button
if (searchButton) {
searchButton.addEventListener("click", function () {
searchModal.classList.add("active");
searchModal.addEventListener("transitionend", function handler() {
searchInput.focus();
searchModal.removeEventListener("transitionend", handler);
}, { once: true });
});
}
// Open search modal on "/" key press
window.addEventListener("keydown", (event) => {
if (event.key === "/" && document.activeElement.tagName !== "INPUT" && document.activeElement.tagName !== "TEXTAREA") {
event.preventDefault();
searchModal.classList.add("active");
searchModal.addEventListener("transitionend", function handler() {
searchInput.focus();
searchModal.removeEventListener("transitionend", handler);
}, { once: true });
}
});
// Close search modal on Escape key
window.addEventListener("keydown", (event) => {
if (event.key === "Escape") {
searchModal.classList.remove("active");
}
});
// Close search modal when clicking outside search-modal-content
searchModal.addEventListener("click", function (e) {
if (!searchModalContent.contains(e.target)) {
searchModal.classList.remove("active");
}
});
// Prevent clicks inside modal content from closing it
searchModalContent.addEventListener("click", function (e) {
e.stopPropagation(); // Stops event from reaching searchModal click handler
});
// Search input event
searchInput.addEventListener("keyup", debounce(async function () {
var term = searchInput.value.trim();
if (term === currentTerm) return;
searchResults.style.display = term === "" ? "none" : "flex";
searchResults.innerHTML = ""; // Clear previous results
currentTerm = term;
if (term === "") return;
var results = (await initIndex()).search(term, options);
if (results.length === 0) {
searchResults.style.display = "none";
return;
}
// Insert formatted search result items
for (var i = 0; i < Math.min(results.length, MAX_ITEMS); i++) {
searchResults.innerHTML += formatSearchResultItem(results[i], term.split(" "));
}
}, 150));
}
if (document.readyState === "complete" ||
(document.readyState !== "loading" && !document.documentElement.doScroll)
) {
initSearch();
} else {
document.addEventListener("DOMContentLoaded", initSearch);
}

File diff suppressed because one or more lines are too long

6
public/sitemap.xml Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://mc.daudix.one/</loc>
</url>
</urlset>

5
public/style.css Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,78 @@
/*
* theme "Monokai Pro" generated by syntect
*/
.z-code {
color: #fcfcfa;
background-color: #2d2a2e;
}
.z-comment {
color: #727072;
}
.z-string {
color: #ffd866;
}
.z-constant.z-numeric {
color: #ab9df2;
}
.z-constant.z-language {
color: #ab9df2;
}
.z-constant.z-character, .z-constant.z-other {
color: #ab9df2;
}
.z-variable {
}
.z-keyword {
color: #ff6188;
}
.z-storage {
color: #ff6188;
}
.z-storage.z-type {
color: #78dce8;
font-style: italic;
}
.z-entity.z-name.z-class {
color: #a9dc76;
text-decoration: underline;
}
.z-entity.z-other.z-inherited-class {
color: #a9dc76;
text-decoration: underline;
font-style: italic;
}
.z-entity.z-name.z-function {
color: #a9dc76;
}
.z-variable.z-parameter {
color: #fc9867;
font-style: italic;
}
.z-entity.z-name.z-tag {
color: #ff6188;
}
.z-entity.z-other.z-attribute-name {
color: #a9dc76;
font-style: italic;
}
.z-support.z-function {
color: #78dce8;
}
.z-support.z-constant {
color: #78dce8;
}
.z-support.z-type, .z-support.z-class {
color: #fcfcfa;
}
.z-support.z-other.z-variable {
}
.z-invalid {
color: #fcfcfa;
background-color: #ff6188;
}
.z-invalid.z-deprecated {
color: #fcfcfa;
background-color: #ae81ff;
}

View file

@ -0,0 +1,78 @@
/*
* theme "Monokai Pro Light" generated by syntect
*/
.z-code {
color: #29242a;
background-color: #faf4f2;
}
.z-comment {
color: #918c8e;
}
.z-string {
color: #cc7a0a;
}
.z-constant.z-numeric {
color: #7058be;
}
.z-constant.z-language {
color: #7058be;
}
.z-constant.z-character, .z-constant.z-other {
color: #7058be;
}
.z-variable {
}
.z-keyword {
color: #e14775;
}
.z-storage {
color: #e14775;
}
.z-storage.z-type {
color: #1c8ca8;
font-style: italic;
}
.z-entity.z-name.z-class {
color: #269d69;
text-decoration: underline;
}
.z-entity.z-other.z-inherited-class {
color: #269d69;
text-decoration: underline;
font-style: italic;
}
.z-entity.z-name.z-function {
color: #269d69;
}
.z-variable.z-parameter {
color: #e16032;
font-style: italic;
}
.z-entity.z-name.z-tag {
color: #e14775;
}
.z-entity.z-other.z-attribute-name {
color: #269d69;
font-style: italic;
}
.z-support.z-function {
color: #1c8ca8;
}
.z-support.z-constant {
color: #1c8ca8;
}
.z-support.z-type, .z-support.z-class {
color: #29242a;
}
.z-support.z-other.z-variable {
}
.z-invalid {
color: #fcfcfa;
background-color: #ff6188;
}
.z-invalid.z-deprecated {
color: #fcfcfa;
background-color: #7058be;
}

1
themes/ametrine Submodule

@ -0,0 +1 @@
Subproject commit f1305f26896cb894c5a88e0f6ded70134d4bd3c8

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible" />
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="robots" content="index, follow">
<title>{{ section.title }}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css">
<style>
body {
display: flex;
flex-direction: column;
justify-content: center;
min-height: 100vh;
}
</style>
</head>
<body>
<main>
{{ section.content | safe }}
</main>
<footer>
<div id="footer-container">
<p>YunoHost</p>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,2 @@
name = "yunohost"
description = "The default theme for the YunoHost Zola package"