Initial commit
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
zola
|
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "themes/ametrine"]
|
||||
path = themes/ametrine
|
||||
url = https://codeberg.org/daudix/ametrine.git
|
204
config.toml
Normal 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, `` is ok but `` isn’t 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
|
@ -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`.
|
||||
|
||||

|
||||
|
||||
<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
After Width: | Height: | Size: 246 B |
143
public/404.html
Normal 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="/" />
|
||||
<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="/" />
|
||||
<meta name="twitter:description" content="" />
|
||||
|
||||
<title>404 - Snug Nook Minecraft Server</title>
|
||||
<link rel="canonical" href="/" />
|
||||
<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://mc.daudix.one/SiteIcon.png" /><div>
|
||||
<span>404</span>
|
||||
<span>Back to Top</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<nav class="overshoot">
|
||||
<ul><li>
|
||||
<a href="https://mc.daudix.one/#up" ><i class="icon house" style="--icon: 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%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/%3E%3C/svg%3E');"></i>Snug Nook Minecraft Server</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://mc.daudix.one#up" class=""><i class="icon house" style="--icon: 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%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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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://mc.daudix.one/">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 “/” to Open Search Bar"><i class="icon keyboard" style="--icon: 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%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/%3E%3C/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
After Width: | Height: | Size: 230 KiB |
9
public/audio-button.js
Normal 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
After Width: | Height: | Size: 31 KiB |
34
public/closable.js
Normal 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
|
@ -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, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
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
|
@ -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
BIN
public/favicon.png
Normal file
After Width: | Height: | Size: 817 B |
BIN
public/fonts/geist-italic.woff2
Normal file
BIN
public/fonts/geist-mono-italic.woff2
Normal file
BIN
public/fonts/geist-mono.woff2
Normal file
BIN
public/fonts/geist.woff2
Normal file
171
public/index.html
Normal 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://mc.daudix.one/SiteIcon.png" /><div>
|
||||
<span>Snug Nook Minecraft Server</span>
|
||||
<span>Back to Top</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<nav class="overshoot">
|
||||
<ul><li>
|
||||
<a href="https://mc.daudix.one/" class="active"><i class="icon house" style="--icon: 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%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/%3E%3C/svg%3E');"></i>Snug Nook Minecraft Server</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="https://mc.daudix.one" class=" active"><i class="icon house" style="--icon: 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%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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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//www.w3.org/2000/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/%3E%3C/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. It’s description is “The Snug Nook® Experience - Now in Minecraft!”" /></p>
|
||||
<style>
|
||||
img {
|
||||
border-radius: 0;
|
||||
}
|
||||
</style>
|
||||
<h2 id="version">Version</h2>
|
||||
<p>Currently we’re 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 <nickname></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 don’t 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">Xaero’s 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 Nook’s 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 “/” to Open Search Bar"><i class="icon keyboard" style="--icon: 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%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/%3E%3C/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/processed_images/banner.1a2809bc9ba6cd2e.jpg
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
public/processed_images/banner.2c644f2a6a177fb2.webp
Normal file
After Width: | Height: | Size: 225 KiB |
BIN
public/processed_images/banner.360bc891ae571e0f.webp
Normal file
After Width: | Height: | Size: 264 KiB |
BIN
public/processed_images/banner.4137a9d43817ad5a.webp
Normal file
After Width: | Height: | Size: 98 B |
BIN
public/processed_images/banner.52f395b2627cf513.webp
Normal file
After Width: | Height: | Size: 82 B |
BIN
public/processed_images/banner.dc8df74740b0f171.jpg
Normal file
After Width: | Height: | Size: 112 KiB |
4
public/robots.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
User-agent: *
|
||||
Disallow:
|
||||
Allow: /
|
||||
Sitemap: https://mc.daudix.one/sitemap.xml
|
236
public/search.js
Normal 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);
|
||||
}
|
1
public/search_index.en.js
Normal file
6
public/sitemap.xml
Normal 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
78
public/syntax-theme-dark.css
Normal 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;
|
||||
}
|
78
public/syntax-theme-light.css
Normal 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
|
33
themes/yunohost/templates/index.html
Normal 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>
|
2
themes/yunohost/theme.toml
Normal file
|
@ -0,0 +1,2 @@
|
|||
name = "yunohost"
|
||||
description = "The default theme for the YunoHost Zola package"
|