Switch to Ametrine

This commit is contained in:
root 2025-03-04 04:23:12 +01:00
parent 8d2b031b5a
commit 53353f0a94
76 changed files with 6164 additions and 2645 deletions

3
.gitmodules vendored
View file

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

View file

@ -1,6 +1,6 @@
title = "RSCC"
description = "Well, get on this site and find out."
theme = "duckquill"
theme = "ametrine"
# The URL the site will be built for
base_url = "https://rootsource.cc"
@ -18,15 +18,21 @@ highlight_code = true
[extra]
# Put all your custom variables here
meta.favicon = true
[extra.footer]
show_copyright = true
show_powered_by = true
show_source = false
copyright = "raíz1.noho.st owns this website"
show_source = true
copyright = "raiz1.noho.st owns this website"
[extra.nav]
force_sidebar = true
links = [
{ url = "Articles/", name = "Articles" },
{ url = "Articles/", name = "Articles", icon = "newspaper" },
{ url = "https://git.rootsource.cc/", name = "Alpsource", icon = "git-merge" },
{ url = "https://haj.rootsource.cc/", name = "Hajiku/Costkey", icon = "fediverse-logo" },
{ url = "https://bin.rootsource.cc/", name = "Estellabin", icon = "lock-laminated" },
]

View file

@ -0,0 +1,91 @@
+++
title = "Transition from Duckquill to Ametrine"
description = "In this guide, we will show you how to transition from Daudix's Duckquill to its successor, Ametrine!"
date = 2025-03-04
[extra]
toc = true
+++
# WIP!
(daudix will have less work writing this fr)
# Step 1: Getting Ametrine
First, you're going to navigate to the themes folder of your Zola installation. Example:
```bash
user@hostname:/# cd /var/www/zola/themes/
user@hostname:/var/www/zola/themes#
```
## Don't clone as submodule
If Git is installed, you're going to clone Ametrine into the themes directory:
```bash
user@hostname:/var/www/zola/themes# git clone https://codeberg.org/daudix/ametrine
cd ametrine
```
## Clone as submodule (recommended!)
Or, if you use Submodules:
```bash
user@hostname:/var/www/zola/themes# git submodule init
user@hostname:/var/www/zola/themes# git submodule add https://codeberg.org/daudix/ametrine.git ametrine
```
# Step 2: Applying Ametrine
Next step is to change the config to use Ametrine instead of Duckquill
For this, go back to the root directory of the Zola installation:
```bash
user@hostname:/var/www/zola/themes# cd ..
user@hostname:/var/www/zola# ls
config.toml content public static templates themes zola
user@hostname:/var/www/zola#
```
## Editing the file manually
Open the file in your favourite editor:
```bash
user@hostname:/var/www/zola# micro config.toml
```
Find the line that says
```toml
theme = "duckquill"
```
and replace it with
```toml
theme = "ametrine"
```
## Using ``sed`` like a pro haxx0r
Feeling skid today? Use the following command to replace the line manually using sed:
```bash
user@hostname:/var/www/zola# sed -i 's/theme = \"duckquill\"/theme = \"ametrine\"/g' config.toml
```
# Building and praying
Well, time to build!
```bash
user@hostname:/var/www/zola# ./zola build
Building site...
Checking all internal links with anchors.
> Successfully checked 0 internal link(s) with anchors.
-> Creating 3 pages (0 orphan) and 1 sections
Done in 341ms.
```
* Note: The zola command may either only be available in the site's directory, or as a widely-available command, depending on your installation method of Zola.
We have done it!
You have transitioned from Duckquill to Ametrine, and so did we, joining [AeroNook (#1)](https://aeronook.tech) and [Mambuco (#2)](https://mambuco.dev/) in the transition, making us the third!
Ametrine is still experimental, but we are happy to see it grow so fast! Thank you [Daudix](https://daudix.one) for blessing us with this fr. Go check him out, he's a great and very talented person!
Thank you for reading!
Sincerely, RootsourceCC.

View file

@ -0,0 +1,37 @@
+++
title = "Set up costmiku ffsync on Firefox"
description = "Shortest article demonstrating how to configure Firefox to synchronise to costmiku ffsync"
date = 2025-03-01
[extra]
toc = true
+++
This has not been written by the RootsourceCC team, but still describes it accurately.
Create a Mozilla account
Go to [https://accounts.firefox.com](https://accounts.firefox.com) and follow the "Sign up" steps to create an account.
**Configure Firefox Desktop**
Please open `about:config` in your Firefox and point `identity.sync.tokenserver.uri` to `https://ffsync.costmiku.space/1.0/sync/1.5`.
**Configure Firefox based browsers on Android**
These steps have to be followed in a strict order. Failing to do it would probably lead to issues. This should also work in Firefox based browsers like Mull (tested) and others.
- Open Firefox Browser -> Settings -> About Firefox -> tap 5 times in Firefox logo.
- Go back to Settings -> Account -> you should see a new option `Sync Debug`, tap on it.
- Select `Custom Sync server` and write there your endpoint. It should be https://ffsync.costmiku.space/1.0/sync/1.5.
- Exit Firefox completely, reopen and then follow the steps of "Connect a device" to your Firefox account.
- After a successful auth process the sync should start working.
Configure Firefox on iOS
Not tested.
- Open Firefox Browser -> Settings -> About Firefox -> tap on the field with Firefox and version number.
- Go back to Settings -> Account -> you should see a new option `Advanced Sync Settings`, tap on it.
- Toggle Use Custom Sync Token Server and write there your endpoint. It should be `https://ffsync.costmiku.space/`.
- You might also need to toggle the switch for custom FxA login server and set it to `https://accounts.firefox.com`
- Exit Firefox completely, reopen and then follow the steps of "Connect a device" to your Firefox account.
- After a successful auth process the sync should start working.

View file

@ -217,8 +217,19 @@ Run the following commands:
einrichter/eic> eic.dirs.create # Creates necessary directories
einrichter/eic> eic.essentials.create # Creates necessary tools
einrichter/eic> eic.essentials.install # Installs the tools
einrichter/eic> eic.essentials.verify # Verifies that the packages are installed
einrichter/eic> eic.clean # Clean up the environment
```
If after running eic.essentials.verify, the packages have not been installed, try to troubleshoot the actual package that failed to install and try again.
Or...re-extract package and reinstall
```bash
einrichter/eic> eic.bugfix.RrX
einrichter/eic> eic.essentials.install
```
BEFORE BUILDING THE ACTUAL SYSTEM!!!!
Run this command. It applies the RrX bugfix that removes and re-extracts affected packages.
```bash

View file

@ -2,13 +2,10 @@
title = "Home - RootSourceCC"
+++
# RootSourceCC
Welcome to RootSourceCC! You could technically call this: "The child of Raíz1, Icycoide and Costmiku"
With the ownership by Raíz1, hosted on and also being in charge of Costmiku, and hosting Icycoide's stuff!
Links:
- [Alpsource (Git forge)](https://git.rootsource.cc)
Proud to say, we are the **third** website to transition from Duckquill to Ametrine!
-[Raíz1](https://raiz1.noho.st) - [Icycoide](https://icycoide.github.io) 2025.

BIN
public/404-static.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 715 B

View file

@ -1,66 +1,108 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<!-- 2025-02-12 Wed 02:30 -->
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#9a9996" />
<meta name="base" content="https://rootsource.cc" />
<title>404 - RSCC</title>
<link rel="canonical" href="&#x2F;" /><link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png" />
<link rel="canonical" href="&#x2F;" />
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://rootsource.cc/apple-touch-icon.png" />
<style type="text/css">
:root {--accent-color: #6f8396;--contrast-color: #fff;}</style>
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="404 - RSCC" />
<meta property="og:url" content="&#x2F;" />
<meta property="og:description" content="Well, get on this site and find out." />
<meta property="og:image" content="https://rootsource.cc/card.png" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="404 - RSCC" />
<meta name="twitter:url" content="&#x2F;" />
<meta name="twitter:description" content="Well, get on this site and find out." />
</head>
<body>
<body >
<header id="site-nav">
<nav>
<a href="#main-content" tabindex="0">
Skip to Main Content
</a>
<ul>
<li id="home">
<a href="https://rootsource.cc">
<i class="icon"></i>RSCC</a>
</li>
<li class="divider"></li>
<li>
<a href="https://rootsource.cc/Articles">Articles</a>
</li>
<li id="search">
<button id="search-toggle" class="circle" title="Search">
<i class="icon"></i>
</button>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>404</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
</ul>
</nav>
<div id="search-container">
<label for="search-bar" class="visually-hidden">Search</label>
<input id="search-bar" placeholder="Search for…" autocomplete="off" type="search" disabled>
<div id="search-results-container">
<div id="search-results"></div>
</div>
</div>
</header>
<main id="main-content">
<picture>
<source srcset="https://rootsource.cc/404.png" media="(prefers-reduced-motion: reduce)"></source>
<img id="not-found" class="pixels transparent no-hover" alt="404"src="https://rootsource.cc/404.gif">
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<picture id="not-found">
<source srcset="https://rootsource.cc/404-static.gif" media="(prefers-reduced-motion: reduce)"></source>
<img class="pixels transparent no-hover drop-shadow" alt="404"src="https://rootsource.cc/404.gif">
</picture>
<h1>Page Not Found</h1>
@ -68,23 +110,32 @@
<p>The requested page could not be found.</p>
<div class="buttons">
<a href="https://rootsource.cc">Go Home</a>
<a href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">Go Home</a>
</div>
<span id="search-index" class="hidden">https://rootsource.cc/search_index.en.json</span>
<span id="more-matches-text" class="hidden">$MATCHES more matches</span>
</div>
</main>
<footer id="site-footer">
<p>raíz1.noho.st owns this website</p>
<p>
<small>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://duckquill.daudix.one" rel="">Duckquill</a>
</small>
</p>
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 B

View file

@ -0,0 +1,213 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="base" content="https://rootsource.cc" />
<title>Transition from Duckquill to Ametrine - RSCC</title>
<link rel="canonical" href="https://rootsource.cc/Articles/duckquill2ametrine/" />
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="Transition from Duckquill to Ametrine - RSCC" />
<meta property="og:url" content="https://rootsource.cc/Articles/duckquill2ametrine/" />
<meta property="og:description" content="In this guide, we will show you how to transition from Daudix&#x27;s Duckquill to its successor, Ametrine!" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Transition from Duckquill to Ametrine - RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/Articles/duckquill2ametrine/" />
<meta name="twitter:description" content="In this guide, we will show you how to transition from Daudix&#x27;s Duckquill to its successor, Ametrine!" />
</head>
<body >
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>Transition from Duckquill to Ametrine</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<article>
<h1 id="heading">Transition from Duckquill to Ametrine</h1><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-03-04T00:00:00+00:00" pubdate>March 04, 2025</time>
</div>
</div>
<aside id="toc">
<strong class="title">Table of Contents</strong>
<div class="overshoot">
<ul><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#wip">WIP!</a></li><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#step-1-getting-ametrine">Step 1: Getting Ametrine</a><ul><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#don-t-clone-as-submodule">Don&#x27;t clone as submodule</a>
</li><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#clone-as-submodule-recommended">Clone as submodule (recommended!)</a>
</li></ul></li><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#step-2-applying-ametrine">Step 2: Applying Ametrine</a><ul><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#editing-the-file-manually">Editing the file manually</a>
</li><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#using-sed-like-a-pro-haxx0r">Using sed like a pro haxx0r</a>
</li></ul></li><li>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/#building-and-praying">Building and praying</a></li></ul>
</div>
</aside><h1 id="wip">WIP!</h1>
<p>(daudix will have less work writing this fr)</p>
<h1 id="step-1-getting-ametrine">Step 1: Getting Ametrine</h1>
<p>First, you're going to navigate to the themes folder of your Zola installation. Example:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/#</span><span> cd /var/www/zola/themes/
</span><span style="color:#bf616a;">user@hostname:/var/www/zola/themes#
</span></code></pre>
<h2 id="don-t-clone-as-submodule">Don't clone as submodule</h2>
<p>If Git is installed, you're going to clone Ametrine into the themes directory:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola/themes#</span><span> git clone https://codeberg.org/daudix/ametrine
</span><span style="color:#96b5b4;">cd</span><span> ametrine
</span></code></pre>
<h2 id="clone-as-submodule-recommended">Clone as submodule (recommended!)</h2>
<p>Or, if you use Submodules:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola/themes#</span><span> git submodule init
</span><span style="color:#bf616a;">user@hostname:/var/www/zola/themes#</span><span> git submodule add https://codeberg.org/daudix/ametrine.git ametrine
</span></code></pre>
<h1 id="step-2-applying-ametrine">Step 2: Applying Ametrine</h1>
<p>Next step is to change the config to use Ametrine instead of Duckquill</p>
<p>For this, go back to the root directory of the Zola installation:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola/themes#</span><span> cd ..
</span><span style="color:#bf616a;">user@hostname:/var/www/zola#</span><span> ls
</span><span style="color:#bf616a;">config.toml</span><span> content public static templates themes zola
</span><span style="color:#bf616a;">user@hostname:/var/www/zola#
</span></code></pre>
<h2 id="editing-the-file-manually">Editing the file manually</h2>
<p>Open the file in your favourite editor:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola#</span><span> micro config.toml
</span></code></pre>
<p>Find the line that says</p>
<pre data-lang="toml" style="background-color:#2b303b;color:#c0c5ce;" class="language-toml "><code class="language-toml" data-lang="toml"><span style="color:#bf616a;">theme </span><span>= &quot;</span><span style="color:#a3be8c;">duckquill</span><span>&quot;
</span></code></pre>
<p>and replace it with</p>
<pre data-lang="toml" style="background-color:#2b303b;color:#c0c5ce;" class="language-toml "><code class="language-toml" data-lang="toml"><span style="color:#bf616a;">theme </span><span>= &quot;</span><span style="color:#a3be8c;">ametrine</span><span>&quot;
</span></code></pre>
<h2 id="using-sed-like-a-pro-haxx0r">Using <code>sed</code> like a pro haxx0r</h2>
<p>Feeling skid today? Use the following command to replace the line manually using sed:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola#</span><span> sed</span><span style="color:#bf616a;"> -i </span><span>&#39;</span><span style="color:#a3be8c;">s/theme = \&quot;duckquill\&quot;/theme = \&quot;ametrine\&quot;/g</span><span>&#39; config.toml
</span></code></pre>
<h1 id="building-and-praying">Building and praying</h1>
<p>Well, time to build!</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">user@hostname:/var/www/zola#</span><span> ./zola build
</span><span style="color:#bf616a;">Building</span><span> site...
</span><span style="color:#bf616a;">Checking</span><span> all internal links with anchors.
</span><span>&gt; Successfully </span><span style="color:#bf616a;">checked</span><span> 0 internal link(s) </span><span style="color:#bf616a;">with</span><span> anchors.
</span><span style="color:#bf616a;">-</span><span>&gt; Creating 3 pages (0 orphan) </span><span style="color:#bf616a;">and</span><span> 1 sections
</span><span style="color:#bf616a;">Done</span><span> in 341ms.
</span></code></pre>
<ul>
<li>Note: The zola command may either only be available in the site's directory, or as a widely-available command, depending on your installation method of Zola.</li>
</ul>
<p>We have done it!</p>
<p>You have transitioned from Duckquill to Ametrine, and so did we, joining <a href="https://aeronook.tech">AeroNook (#1)</a> and <a href="https://mambuco.dev/">Mambuco (#2)</a> in the transition, making us the third!</p>
<p>Ametrine is still experimental, but we are happy to see it grow so fast! Thank you <a href="https://daudix.one">Daudix</a> for blessing us with this fr. Go check him out, he's a great and very talented person!</p>
<p>Thank you for reading!</p>
<p>Sincerely, RootsourceCC.</p>
</article><hr />
<nav id="post-nav"><a class="post-nav-item post-nav-prev" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;set-up-costmiku-ffsync&#x2F;">
<div class="nav-arrow">Previous</div>
<span class="post-title">Set up costmiku ffsync on Firefox</span>
</a></nav>
</div>
</main>
<footer id="site-footer">
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

View file

@ -1,111 +1,190 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<!-- 2025-02-12 Wed 02:30 -->
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#9a9996" />
<meta name="base" content="https://rootsource.cc" />
<title>Articles - RSCC</title>
<link rel="canonical" href="https://rootsource.cc/Articles/" /><link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png" />
<link rel="canonical" href="https://rootsource.cc/Articles/" />
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://rootsource.cc/apple-touch-icon.png" />
<style type="text/css">
:root {--accent-color: #6f8396;--contrast-color: #fff;}</style>
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="Articles - RSCC" />
<meta property="og:url" content="https://rootsource.cc/Articles/" />
<meta property="og:description" content="Well, get on this site and find out." />
<meta property="og:image" content="https://rootsource.cc/card.png" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Articles - RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/Articles/" />
<meta name="twitter:description" content="Well, get on this site and find out." />
</head>
<body>
<body >
<header id="site-nav">
<nav>
<a href="#main-content" tabindex="0">
Skip to Main Content
</a>
<ul>
<li id="home">
<a href="https://rootsource.cc">
<i class="icon"></i>RSCC</a>
</li>
<li class="divider"></li>
<li>
<a href="https://rootsource.cc/Articles"class="active">Articles</a>
</li>
<li id="search">
<button id="search-toggle" class="circle" title="Search">
<i class="icon"></i>
</button>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>Articles</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
</ul>
</nav>
<div id="search-container">
<label for="search-bar" class="visually-hidden">Search</label>
<input id="search-bar" placeholder="Search for…" autocomplete="off" type="search" disabled>
<div id="search-results-container">
<div id="search-results"></div>
</div>
</div>
</header>
<main id="main-content">
<h1>Articles</h1>
<li>
<a href="https://rootsource.cc/Articles" class="
active
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<h1>Articles</h1>
<p>
<small>
1 post in total
3 posts in total
</small>
</p>
<div id="article-list"><article >
<a href="https://rootsource.cc/Articles/tylkolinux-installation/"></a>
<div class="article-list">
<article class="
<h3>TylkoLinux install guide (Delirium).</h3>
<p>This article will go over the installation guide for the distro</p>
<div class="details">
<small>
<time datetime="2025-01-30T00:00:00+00:00" pubdate>January 30, 2025</time></small>
</div></article>
">
<div>
<a href="https://rootsource.cc/Articles/duckquill2ametrine/">
<h3>Transition from Duckquill to Ametrine</h3>
</a><div class="description">
<p>In this guide, we will show you how to transition from Daudix's Duckquill to its successor, Ametrine!</p>
</div><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-03-04T00:00:00+00:00" pubdate>March 04, 2025</time>
</div>
</div>
</div>
<a class="open-post" href="https://rootsource.cc/Articles/duckquill2ametrine/"><i class="ph-bold ph-caret-right"></i>
</a>
</article>
<article class="
">
<div>
<a href="https://rootsource.cc/Articles/set-up-costmiku-ffsync/">
<h3>Set up costmiku ffsync on Firefox</h3>
</a><div class="description">
<p>Shortest article demonstrating how to configure Firefox to synchronise to costmiku ffsync</p>
</div><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-03-01T00:00:00+00:00" pubdate>March 01, 2025</time>
</div>
</div>
</div>
<a class="open-post" href="https://rootsource.cc/Articles/set-up-costmiku-ffsync/"><i class="ph-bold ph-caret-right"></i>
</a>
</article>
</div>
<nav id="paginator">
<span id="paginator-first" title="First">
<i class="icon"></i>
<i class="ph-bold ph-caret-line-left"></i>
</span>
<span id="paginator-previous" title="Previous">
<i class="icon"></i>
</span><span id="paginator-counter">1/1</span><span id="paginator-next" title="Next">
<i class="icon"></i>
</span>
<span id="paginator-last" title="Last">
<i class="icon"></i>
</span></nav>
<span id="search-index" class="hidden">https://rootsource.cc/search_index.en.json</span>
<span id="more-matches-text" class="hidden">$MATCHES more matches</span>
<i class="ph-bold ph-caret-left"></i>
</span><span id="paginator-counter">1/2</span><a id="paginator-next" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;page&#x2F;2&#x2F;" title="Next">
<i class="ph-bold ph-caret-right"></i>
</a><a id="paginator-last" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;page&#x2F;2&#x2F;" title="Last">
<i class="ph-bold ph-caret-line-right"></i>
</a>
</nav>
</div>
</main>
<footer id="site-footer">
<p>raíz1.noho.st owns this website</p>
<p>
<small>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://duckquill.daudix.one" rel="">Duckquill</a>
</small>
</p>
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,170 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="base" content="https://rootsource.cc" />
<title>Articles - RSCC</title>
<link rel="canonical" href="https://rootsource.cc/Articles/page/2/" />
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="Articles - RSCC" />
<meta property="og:url" content="https://rootsource.cc/Articles/page/2/" />
<meta property="og:description" content="Well, get on this site and find out." />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Articles - RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/Articles/page/2/" />
<meta name="twitter:description" content="Well, get on this site and find out." />
</head>
<body >
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>Articles</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<h1>Articles</h1>
<p>
<small>
3 posts in total
</small>
</p>
<div class="article-list">
<article class="
">
<div>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/">
<h3>TylkoLinux install guide (Delirium).</h3>
</a><div class="description">
<p>This article will go over the installation guide for the distro</p>
</div><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-01-30T00:00:00+00:00" pubdate>January 30, 2025</time>
</div>
</div>
</div>
<a class="open-post" href="https://rootsource.cc/Articles/tylkolinux-installation/"><i class="ph-bold ph-caret-right"></i>
</a>
</article>
</div>
<nav id="paginator"><a id="paginator-first" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;" title="First">
<i class="ph-bold ph-caret-line-left"></i>
</a>
<a id="paginator-previous" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;" title="Previous">
<i class="ph-bold ph-caret-left"></i>
</a>
<span id="paginator-counter">2/2</span><span id="paginator-next" title="Next">
<i class="ph-bold ph-caret-right"></i>
</span>
<span id="paginator-last" title="Last">
<i class="ph-bold ph-caret-line-right"></i>
</span></nav>
</div>
</main>
<footer id="site-footer">
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,167 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="base" content="https://rootsource.cc" />
<title>Set up costmiku ffsync on Firefox - RSCC</title>
<link rel="canonical" href="https://rootsource.cc/Articles/set-up-costmiku-ffsync/" />
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="Set up costmiku ffsync on Firefox - RSCC" />
<meta property="og:url" content="https://rootsource.cc/Articles/set-up-costmiku-ffsync/" />
<meta property="og:description" content="Shortest article demonstrating how to configure Firefox to synchronise to costmiku ffsync" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Set up costmiku ffsync on Firefox - RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/Articles/set-up-costmiku-ffsync/" />
<meta name="twitter:description" content="Shortest article demonstrating how to configure Firefox to synchronise to costmiku ffsync" />
</head>
<body >
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>Set up costmiku ffsync on Firefox</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<article>
<h1 id="heading">Set up costmiku ffsync on Firefox</h1><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-03-01T00:00:00+00:00" pubdate>March 01, 2025</time>
</div>
</div>
<p>This has not been written by the RootsourceCC team, but still describes it accurately.</p>
<p>Create a Mozilla account</p>
<p>Go to <a href="https://accounts.firefox.com">https://accounts.firefox.com</a> and follow the "Sign up" steps to create an account.</p>
<p><strong>Configure Firefox Desktop</strong></p>
<p>Please open <code>about:config</code> in your Firefox and point <code>identity.sync.tokenserver.uri</code> to <code>https://ffsync.costmiku.space/1.0/sync/1.5</code>.</p>
<p><strong>Configure Firefox based browsers on Android</strong></p>
<p>These steps have to be followed in a strict order. Failing to do it would probably lead to issues. This should also work in Firefox based browsers like Mull (tested) and others.</p>
<ul>
<li>Open Firefox Browser -&gt; Settings -&gt; About Firefox -&gt; tap 5 times in Firefox logo.</li>
<li>Go back to Settings -&gt; Account -&gt; you should see a new option <code>Sync Debug</code>, tap on it.</li>
<li>Select <code>Custom Sync server</code> and write there your endpoint. It should be https://ffsync.costmiku.space/1.0/sync/1.5.</li>
<li>Exit Firefox completely, reopen and then follow the steps of "Connect a device" to your Firefox account.</li>
<li>After a successful auth process the sync should start working.</li>
</ul>
<p>Configure Firefox on iOS</p>
<p>Not tested.</p>
<ul>
<li>Open Firefox Browser -&gt; Settings -&gt; About Firefox -&gt; tap on the field with Firefox and version number.</li>
<li>Go back to Settings -&gt; Account -&gt; you should see a new option <code>Advanced Sync Settings</code>, tap on it.</li>
<li>Toggle Use Custom Sync Token Server and write there your endpoint. It should be <code>https://ffsync.costmiku.space/</code>.</li>
<li>You might also need to toggle the switch for custom FxA login server and set it to <code>https://accounts.firefox.com</code></li>
<li>Exit Firefox completely, reopen and then follow the steps of "Connect a device" to your Firefox account.</li>
<li>After a successful auth process the sync should start working.</li>
</ul>
</article><hr />
<nav id="post-nav"><a class="post-nav-item post-nav-prev" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;tylkolinux-installation&#x2F;">
<div class="nav-arrow">Previous</div>
<span class="post-title">TylkoLinux install guide (Delirium).</span>
</a><a class="post-nav-item post-nav-next" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;duckquill2ametrine&#x2F;">
<div class="nav-arrow">Next</div>
<span class="post-title">Transition from Duckquill to Ametrine</span>
</a></nav>
</div>
</main>
<footer id="site-footer">
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

View file

@ -1,106 +1,144 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<!-- 2025-02-12 Wed 02:30 -->
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#9a9996" />
<meta name="base" content="https://rootsource.cc" />
<title>TylkoLinux install guide (Delirium). - RSCC</title>
<link rel="canonical" href="https://rootsource.cc/Articles/tylkolinux-installation/" /><link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png" />
<link rel="canonical" href="https://rootsource.cc/Articles/tylkolinux-installation/" />
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://rootsource.cc/apple-touch-icon.png" />
<style type="text/css">
:root {--accent-color: #6f8396;--contrast-color: #fff;}</style>
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="TylkoLinux install guide (Delirium). - RSCC" />
<meta property="og:url" content="https://rootsource.cc/Articles/tylkolinux-installation/" />
<meta property="og:description" content="This article will go over the installation guide for the distro" />
<meta property="og:image" content="https://rootsource.cc/card.png" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="TylkoLinux install guide (Delirium). - RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/Articles/tylkolinux-installation/" />
<meta name="twitter:description" content="This article will go over the installation guide for the distro" />
</head>
<body>
<body >
<header id="site-nav">
<nav>
<a href="#main-content" tabindex="0">
Skip to Main Content
</a>
<ul>
<li id="home">
<a href="https://rootsource.cc">
<i class="icon"></i>RSCC</a>
</li>
<li class="divider"></li>
<li>
<a href="https://rootsource.cc/Articles">Articles</a>
</li>
<li id="search">
<button id="search-toggle" class="circle" title="Search">
<i class="icon"></i>
</button>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>TylkoLinux install guide (Delirium).</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
</ul>
</nav>
<div id="search-container">
<label for="search-bar" class="visually-hidden">Search</label>
<input id="search-bar" placeholder="Search for…" autocomplete="off" type="search" disabled>
<div id="search-results-container">
<div id="search-results"></div>
</div>
</div>
</header>
<main id="main-content">
<article><div id="heading"><p>
<small>
<time datetime=" 2025-01-30T00:00:00+00:00">Published on
January 30, 2025</time></small>
</p><h1>TylkoLinux install guide (Delirium).</h1>
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<div id="buttons-container"><details id="toc" class="closable">
<summary title="Table of Contents"><i class="icon"></i></summary>
<div>
<strong class="title">Table of Contents</strong>
<div>
<ul><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#update-as-of-now-don-t-proceed-with-the-guide-yet-the-script-is-still-in-its-testing-phase-and-i-m-halfway-done-successfully-testing-it-p">Update as of now: DON&#x27;T PROCEED WITH THE GUIDE YET. The script is still in its testing phase, and I&#x27;m halfway done successfully testing it :p</a><ul><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s1-cloning-the-repository">S1: Cloning the repository</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s2-run-the-compatibility-checker">S2: Run the compatibility checker</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s3-partitioning-the-target-device">S3: Partitioning the target device</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s4-setting-the-lfs-variable">S4: Setting the $LFS variable</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s5-mounting-the-partitions">S5: Mounting the partitions</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s6-start-the-core-installation-tool">S6: Start the core installation tool</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s7-enter-lfs-user">S7: Enter lfs user</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s8-actually-building-the-system-itself">S8: Actually building the system itself</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s9-setting-up-the-system">S9: Setting up the system</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s10-making-it-boot">S10: Making it boot</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s11-the-end-tm">S11: The End:tm:</a>
</li></ul></li></ul>
</div>
</div>
</details><a id="go-to-top" href="#top" title="Go to Top"><i class="icon"></i></a></div><p>Requires the branch for <code>TylkoLinux 25.2 Delirium x86_64</code></p>
<main id="main-content" class="has-navbar"><div class="container">
<article>
<h1 id="heading">TylkoLinux install guide (Delirium).</h1><div class="article-details"><div class="item">
<i class="ph-bold ph-calendar"></i>
<time datetime="2025-01-30T00:00:00+00:00" pubdate>January 30, 2025</time>
</div>
</div>
<aside id="toc">
<strong class="title">Table of Contents</strong>
<div class="overshoot">
<ul><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#update-as-of-now-don-t-proceed-with-the-guide-yet-the-script-is-still-in-its-testing-phase-and-i-m-halfway-done-successfully-testing-it-p">Update as of now: DON&#x27;T PROCEED WITH THE GUIDE YET. The script is still in its testing phase, and I&#x27;m halfway done successfully testing it :p</a><ul><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s1-cloning-the-repository">S1: Cloning the repository</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s2-run-the-compatibility-checker">S2: Run the compatibility checker</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s3-partitioning-the-target-device">S3: Partitioning the target device</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s4-setting-the-lfs-variable">S4: Setting the $LFS variable</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s5-mounting-the-partitions">S5: Mounting the partitions</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s6-start-the-core-installation-tool">S6: Start the core installation tool</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s7-enter-lfs-user">S7: Enter lfs user</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s8-actually-building-the-system-itself">S8: Actually building the system itself</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s9-setting-up-the-system">S9: Setting up the system</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s10-making-it-boot">S10: Making it boot</a>
</li><li>
<a href="https://rootsource.cc/Articles/tylkolinux-installation/#s11-the-end-tm">S11: The End:tm:</a>
</li></ul></li></ul>
</div>
</aside><p>Requires the branch for <code>TylkoLinux 25.2 Delirium x86_64</code></p>
<p>As you may have read in the description, this article serves as a guide to install (build) TylkoLinux on your machine.
<blockquote class="important">
<p class="alert-title">
<i class="icon"></i>Important</p>
<i class="ph-bold ph-warning-diamond"></i>Important</p>
<p>Prerequisites:</p>
<ul>
<li>x86_64 machine</li>
@ -141,7 +179,7 @@ Now, of course, there are a lot of guides on how to do that online and depending
</span></code></pre>
<blockquote class="caution">
<p class="alert-title">
<i class="icon"></i>Caution</p>
<i class="ph-bold ph-warning-octagon"></i>Caution</p>
<p>Make sure that the $LFS variable always points to the correct destination.
It is recommended to always mount the target root partition under /mnt/lfs and set your variable to that.
Failure to do so may lead you to absolutely fuck up your system.</p>
@ -149,7 +187,7 @@ Failure to do so may lead you to absolutely fuck up your system.</p>
</blockquote>
<blockquote class="tip">
<p class="alert-title">
<i class="icon"></i>Tip</p>
<i class="ph-bold ph-lightbulb"></i>Tip</p>
<p>From the LFS handbook:
One way to ensure that the LFS variable is always set is to edit the .bash_profile file in both your personal home directory and in /root/.bash_profile and enter the export command above. In addition, the shell specified in the /etc/passwd file for all users that need the LFS variable must be bash to ensure that the /root/.bash_profile file is incorporated as a part of the login process.</p>
<p>Another consideration is the method that is used to log into the host system. If logging in through a graphical display manager, the user's .bash_profile is not normally used when a virtual terminal is started. In this case, add the export command to the .bashrc file for the user and root. In addition, some distributions use an "if" test, and do not run the remaining .bashrc instructions for a non-interactive bash invocation. Be sure to place the export command ahead of the test for non-interactive use.</p>
@ -170,7 +208,7 @@ One way to ensure that the LFS variable is always set is to edit the .bash_profi
</span></code></pre>
<blockquote class="caution">
<p class="alert-title">
<i class="icon"></i>Caution</p>
<i class="ph-bold ph-warning-octagon"></i>Caution</p>
<p>The instructions above assume that you are not rebooting your computer during the build. (imagine)
To automatically remount the partition on boot, modify /etc/fstab by adding this line:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">/dev/</span><span>&lt;foo&gt; /mnt/lfs ext4 defaults 1 1
@ -241,7 +279,7 @@ Now HERE begins the real work (insert lqtroll emoji)</p>
<h2 id="s8-actually-building-the-system-itself">S8: Actually building the system itself</h2>
<blockquote class="tip">
<p class="alert-title">
<i class="icon"></i>Tip</p>
<i class="ph-bold ph-lightbulb"></i>Tip</p>
<p>Before proceeding with the build,
One way to ensure that the LFS variable is always set is to edit the .bash_profile file in both your personal home directory and in /root/.bash_profile and enter the export command above. In addition, the shell specified in the /etc/passwd file for all users that need the LFS variable must be bash to ensure that the /root/.bash_profile file is incorporated as a part of the login process.</p>
<p>Another consideration is the method that is used to log into the host system. If logging in through a graphical display manager, the user's .bash_profile is not normally used when a virtual terminal is started. In this case, add the export command to the .bashrc file for the user and root. In addition, some distributions use an "if" test, and do not run the remaining .bashrc instructions for a non-interactive bash invocation. Be sure to place the export command ahead of the test for non-interactive use.</p>
@ -260,8 +298,14 @@ Run the following commands:</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">einrichter/eic</span><span>&gt; eic.dirs.create </span><span style="color:#65737e;"># Creates necessary directories
</span><span>einrichter/eic&gt; eic.essentials.create </span><span style="color:#65737e;"># Creates necessary tools
</span><span>einrichter/eic&gt; eic.essentials.install </span><span style="color:#65737e;"># Installs the tools
</span><span>einrichter/eic&gt; eic.essentials.verify </span><span style="color:#65737e;"># Verifies that the packages are installed
</span><span>einrichter/eic&gt; eic.clean </span><span style="color:#65737e;"># Clean up the environment
</span></code></pre>
<p>If after running eic.essentials.verify, the packages have not been installed, try to troubleshoot the actual package that failed to install and try again.</p>
<p>Or...re-extract package and reinstall</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">einrichter/eic</span><span>&gt; eic.bugfix.RrX
</span><span style="color:#bf616a;">einrichter/eic</span><span>&gt; eic.essentials.install
</span></code></pre>
<p>BEFORE BUILDING THE ACTUAL SYSTEM!!!!
Run this command. It applies the RrX bugfix that removes and re-extracts affected packages.</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">einrichter/eic</span><span>&gt; eic.bugfix.RrX
@ -292,7 +336,7 @@ To do so, run the following:</p>
<h4 id="s9-1-1-network-device-naming">S9.1.1: Network Device Naming</h4>
<p><blockquote class="tip">
<p class="alert-title">
<i class="icon"></i>Tip</p>
<i class="ph-bold ph-lightbulb"></i>Tip</p>
<p>Modified from the LFS handbook: The interface names depend on the implementation and configuration of the udev daemon running on the system. The udev daemon for TylkoLinux (well, LFS) (systemd-udevd) will not run unless the TylkoLinux/LFS system is booted. So it's unreliable to determine the interface names being used in the TylkoLinux system by running those commands on the host distro, even though you are in the chroot environment.</p>
</blockquote>
@ -322,7 +366,7 @@ For most systems, there is only one network interface for each type of connectio
<h4 id="s9-1-4-etc-resolv-conf">S9.1.4: /etc/resolv.conf</h4>
<blockquote class="tip">
<p class="alert-title">
<i class="icon"></i>Tip</p>
<i class="ph-bold ph-lightbulb"></i>Tip</p>
<p>From the LFS handbook: If using methods incompatible with systemd-resolved to configure your network interfaces (ex: ppp, etc.), or if using any type of local resolver (ex: bind, dnsmasq, unbound, etc.), or any other software that generates an /etc/resolv.conf (ex: a resolvconf program other than the one provided by systemd), the systemd-resolved service should not be used.</p>
<p>To switch settings about whether this should be allowed or not, run the command below ↓</p>
@ -466,21 +510,34 @@ Update the GRUB config with the respective command.</p>
</span></code></pre>
<p>Hope you had as much fun following the guide as I did writing it!</p>
</article>
<span id="search-index" class="hidden">https://rootsource.cc/search_index.en.json</span>
<span id="more-matches-text" class="hidden">$MATCHES more matches</span>
</article><hr />
<nav id="post-nav"><a class="post-nav-item post-nav-next" href="https:&#x2F;&#x2F;rootsource.cc&#x2F;Articles&#x2F;set-up-costmiku-ffsync&#x2F;">
<div class="nav-arrow">Next</div>
<span class="post-title">Set up costmiku ffsync on Firefox</span>
</a></nav>
</div>
</main>
<footer id="site-footer">
<p>raíz1.noho.st owns this website</p>
<p>
<small>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://duckquill.daudix.one" rel="">Duckquill</a>
</small>
</p>
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

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();
}

View file

@ -1 +0,0 @@
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};return function(){r.d(o,{default:function(){return d}});var e=r(771),t=r.n(e);const n=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},i=/^\\begin{/;var a=function(e,t){let r;const o=[],a=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;r=e.search(a),-1!==r;){r>0&&(o.push({type:"text",data:e.slice(0,r)}),e=e.slice(r));const a=t.findIndex((t=>e.startsWith(t.left)));if(r=n(t[a].right,e,t[a].left.length),-1===r)break;const l=e.slice(0,r+t[a].right.length),s=i.test(l)?l:e.slice(t[a].left.length,r);o.push({type:"math",data:s,rawData:l,display:t[a].display}),e=e.slice(r+t[a].right.length)}return""!==e&&o.push({type:"text",data:e}),o};const l=function(e,n){const r=a(e,n.delimiters);if(1===r.length&&"text"===r[0].type)return null;const o=document.createDocumentFragment();for(let e=0;e<r.length;e++)if("text"===r[e].type)o.appendChild(document.createTextNode(r[e].data));else{const i=document.createElement("span");let a=r[e].data;n.displayMode=r[e].display;try{n.preProcess&&(a=n.preProcess(a)),t().render(a,i,n)}catch(i){if(!(i instanceof t().ParseError))throw i;n.errorCallback("KaTeX auto-render: Failed to parse `"+r[e].data+"` with ",i),o.appendChild(document.createTextNode(r[e].rawData));continue}o.appendChild(i)}return o},s=function(e,t){for(let n=0;n<e.childNodes.length;n++){const r=e.childNodes[n];if(3===r.nodeType){let o=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;const s=l(o,t);if(s){for(let e=0;e<a;e++)r.nextSibling.remove();n+=s.childNodes.length-1,e.replaceChild(s,r)}else n+=a}else if(1===r.nodeType){const e=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&s(r,t)}}};var d=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},s(e,n)}}(),o=o.default}()}));

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -25,3 +25,17 @@ document.addEventListener("click", function (event) {
});
}
});
const toggleNavbar = document.getElementById("toggle-navbar");
const siteNavbar = document.getElementById("site-navbar");
const mainContent = document.getElementById("main-content");
toggleNavbar.addEventListener("change", () => {
if (toggleNavbar.checked) {
toggleSidebar.checked = false;
}
});
mainContent.addEventListener("click", () => {
if (toggleNavbar.checked) toggleNavbar.checked = false;
});

View file

@ -1,21 +1,18 @@
// Taken from https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/
// Attachment, card, and spoiler code taken from https://github.com/cassidyjames/cassidyjames.github.io/blob/99782788a7e3ba3cc52d6803010873abd1b02b9e/_includes/comments.html#L251-L296
// 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 blogPostAuthorText = document.getElementById("blog-post-author-text").textContent;
let boostsFromText = document.getElementById("boosts-from-text").textContent;
let dateLocale = document.getElementById("date-locale").textContent;
let favesFromText = document.getElementById("faves-from-text").textContent;
let host = document.getElementById("host").textContent;
let id = document.getElementById("id").textContent;
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 relAttributes = document.getElementById("rel-attributes").textContent;
let reloadText = document.getElementById("reload-text").textContent;
let sensitiveText = document.getElementById("sensitive-text").textContent;
let user = document.getElementById("user").textContent;
let viewCommentText = document.getElementById("view-comment-text").textContent;
let viewProfileText = document.getElementById("view-profile-text").textContent;
document.getElementById("load-comments").addEventListener("click", loadComments);
@ -25,8 +22,9 @@ function escapeHtml(unsafe) {
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
.replace(/'/g, "&#x27;");
}
function emojify(input, emojis) {
let output = input;
@ -40,8 +38,9 @@ function emojify(input, emojis) {
let img = document.createElement("img");
img.className = "emoji";
img.setAttribute("src", escapeHtml(emoji.static_url));
img.setAttribute("alt", `:${emoji.shortcode}:`);
img.setAttribute("title", `:${emoji.shortcode}:`);
img.setAttribute("width", "24");
img.setAttribute("height", "24");
if (lazyAsyncImage == "true") {
img.setAttribute("decoding", "async");
img.setAttribute("loading", "lazy");
@ -146,39 +145,24 @@ function loadComments() {
avatar.className = "avatar-link";
avatar.setAttribute("href", status.account.url);
avatar.setAttribute("rel", relAttributes);
avatar.setAttribute(
"title",
`${viewProfileText} @${status.account.username}@${instance}`
);
avatar.appendChild(avatarPicture);
comment.appendChild(avatar);
let instanceBadge = document.createElement("a");
instanceBadge.className = "instance";
instanceBadge.setAttribute("href", status.account.url);
instanceBadge.setAttribute(
"title",
`@${status.account.username}@${instance}`
);
instanceBadge.setAttribute("rel", relAttributes);
instanceBadge.textContent = instance;
let display = document.createElement("span");
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 header = document.createElement("header");
header.className = "author";
header.appendChild(display);
header.appendChild(instanceBadge);
comment.appendChild(header);
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("title", `${viewCommentText} ${instance}`);
permalink.setAttribute("rel", relAttributes);
permalink.textContent = new Date(
status.created_at
@ -189,9 +173,15 @@ function loadComments() {
let timestamp = document.createElement("time");
timestamp.setAttribute("datetime", status.created_at);
timestamp.classList.add("timestamp");
timestamp.appendChild(permalink);
permalink.classList.add("external");
comment.appendChild(timestamp);
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");
@ -232,7 +222,6 @@ function loadComments() {
mediaElement.setAttribute("src", attachment.preview_url);
if (attachment.description != null) {
mediaElement.setAttribute("alt", attachment.description);
mediaElement.setAttribute("title", attachment.description);
}
@ -254,7 +243,6 @@ function loadComments() {
mediaElement.setAttribute("controls", "");
if (attachment.description != null) {
mediaElement.setAttribute("aria-title", attachment.description);
mediaElement.setAttribute("title", attachment.description);
}
@ -273,7 +261,6 @@ function loadComments() {
mediaElement.setAttribute("loop", "");
if (attachment.description != null) {
mediaElement.setAttribute("aria-title", attachment.description);
mediaElement.setAttribute("title", attachment.description);
}
@ -290,7 +277,6 @@ function loadComments() {
mediaElement.setAttribute("controls", "");
if (attachment.description != null) {
mediaElement.setAttribute("aria-title", attachment.description);
mediaElement.setAttribute("title", attachment.description);
}
@ -315,10 +301,9 @@ function loadComments() {
let boosts = document.createElement("a");
boosts.className = "boosts";
boosts.setAttribute("href", `${status.url}/reblogs`);
boosts.setAttribute("title", `${boostsFromText}`.replace("$INSTANCE", instance));
let boostsIcon = document.createElement("i");
boostsIcon.className = "icon";
boostsIcon.classList.add("ph-bold", "ph-repeat");
boosts.appendChild(boostsIcon);
boosts.insertAdjacentHTML('beforeend', ` ${status.reblogs_count}`);
interactions.appendChild(boosts);
@ -326,13 +311,52 @@ function loadComments() {
let faves = document.createElement("a");
faves.className = "faves";
faves.setAttribute("href", `${status.url}/favourites`);
faves.setAttribute("title", `${favesFromText}`.replace("$INSTANCE", instance));
let favesIcon = document.createElement("i");
favesIcon.className = "icon";
favesIcon.classList.add("ph-bold", "ph-star");
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) {
@ -370,21 +394,11 @@ function loadComments() {
if (op === true) {
comment.classList.add("op");
avatar.classList.add("op");
avatar.setAttribute(
"title",
`${blogPostAuthorText}: ` + avatar.getAttribute("title")
);
instanceBadge.classList.add("op");
instanceBadge.setAttribute(
"title",
`${blogPostAuthorText}: ` + instanceBadge.getAttribute("title")
);
instanceBadge.setAttribute("title", articleAuthorText);
}
commentsWrapper.innerHTML += comment.outerHTML;
commentsWrapper.appendChild(comment);
});
}

View file

@ -10,18 +10,27 @@ document.addEventListener("DOMContentLoaded", function () {
title.innerHTML = lang;
// Copy button icon
let icon = document.createElement("i");
icon.classList.add("icon");
let iconCopy = document.createElement("i");
iconCopy.classList.add("ph-bold", "ph-copy");
let iconCheck = document.createElement("i");
iconCheck.classList.add("ph-bold", "ph-check-square-offset");
// Copy button
let button = document.createElement("button");
let copyCodeText = document.getElementById("copy-code-text").textContent;
button.setAttribute("title", copyCodeText)
button.appendChild(icon);
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);
@ -35,7 +44,7 @@ document.addEventListener("DOMContentLoaded", function () {
container.appendChild(block);
button.addEventListener("click", async () => {
await copyCode(block, header, button); // Pass the button here
await copyCode(block, header, button);
});
}
});

View file

@ -1,271 +0,0 @@
// GoatCounter: https://www.goatcounter.com
// This file is released under the ISC license: https://opensource.org/licenses/ISC
;(function() {
'use strict';
if (window.goatcounter && window.goatcounter.vars) // Compatibility with very old version; do not use.
window.goatcounter = window.goatcounter.vars
else
window.goatcounter = window.goatcounter || {}
// Load settings from data-goatcounter-settings.
var s = document.querySelector('script[data-goatcounter]')
if (s && s.dataset.goatcounterSettings) {
try { var set = JSON.parse(s.dataset.goatcounterSettings) }
catch (err) { console.error('invalid JSON in data-goatcounter-settings: ' + err) }
for (var k in set)
if (['no_onload', 'no_events', 'allow_local', 'allow_frame', 'path', 'title', 'referrer', 'event'].indexOf(k) > -1)
window.goatcounter[k] = set[k]
}
var enc = encodeURIComponent
// Get all data we're going to send off to the counter endpoint.
var get_data = function(vars) {
var data = {
p: (vars.path === undefined ? goatcounter.path : vars.path),
r: (vars.referrer === undefined ? goatcounter.referrer : vars.referrer),
t: (vars.title === undefined ? goatcounter.title : vars.title),
e: !!(vars.event || goatcounter.event),
s: [window.screen.width, window.screen.height, (window.devicePixelRatio || 1)],
b: is_bot(),
q: location.search,
}
var rcb, pcb, tcb // Save callbacks to apply later.
if (typeof(data.r) === 'function') rcb = data.r
if (typeof(data.t) === 'function') tcb = data.t
if (typeof(data.p) === 'function') pcb = data.p
if (is_empty(data.r)) data.r = document.referrer
if (is_empty(data.t)) data.t = document.title
if (is_empty(data.p)) data.p = get_path()
if (rcb) data.r = rcb(data.r)
if (tcb) data.t = tcb(data.t)
if (pcb) data.p = pcb(data.p)
return data
}
// Check if a value is "empty" for the purpose of get_data().
var is_empty = function(v) { return v === null || v === undefined || typeof(v) === 'function' }
// See if this looks like a bot; there is some additional filtering on the
// backend, but these properties can't be fetched from there.
var is_bot = function() {
// Headless browsers are probably a bot.
var w = window, d = document
if (w.callPhantom || w._phantom || w.phantom)
return 150
if (w.__nightmare)
return 151
if (d.__selenium_unwrapped || d.__webdriver_evaluate || d.__driver_evaluate)
return 152
if (navigator.webdriver)
return 153
return 0
}
// Object to urlencoded string, starting with a ?.
var urlencode = function(obj) {
var p = []
for (var k in obj)
if (obj[k] !== '' && obj[k] !== null && obj[k] !== undefined && obj[k] !== false)
p.push(enc(k) + '=' + enc(obj[k]))
return '?' + p.join('&')
}
// Show a warning in the console.
var warn = function(msg) {
if (console && 'warn' in console)
console.warn('goatcounter: ' + msg)
}
// Get the endpoint to send requests to.
var get_endpoint = function() {
var s = document.querySelector('script[data-goatcounter]')
if (s && s.dataset.goatcounter)
return s.dataset.goatcounter
return (goatcounter.endpoint || window.counter) // counter is for compat; don't use.
}
// Get current path.
var get_path = function() {
var loc = location,
c = document.querySelector('link[rel="canonical"][href]')
if (c) { // May be relative or point to different domain.
var a = document.createElement('a')
a.href = c.href
if (a.hostname.replace(/^www\./, '') === location.hostname.replace(/^www\./, ''))
loc = a
}
return (loc.pathname + loc.search) || '/'
}
// Run function after DOM is loaded.
var on_load = function(f) {
if (document.body === null)
document.addEventListener('DOMContentLoaded', function() { f() }, false)
else
f()
}
// Filter some requests that we (probably) don't want to count.
goatcounter.filter = function() {
if ('visibilityState' in document && document.visibilityState === 'prerender')
return 'visibilityState'
if (!goatcounter.allow_frame && location !== parent.location)
return 'frame'
if (!goatcounter.allow_local && location.hostname.match(/(localhost$|^127\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.|^0\.0\.0\.0$)/))
return 'localhost'
if (!goatcounter.allow_local && location.protocol === 'file:')
return 'localfile'
if (localStorage && localStorage.getItem('skipgc') === 't')
return 'disabled with #toggle-goatcounter'
return false
}
// Get URL to send to GoatCounter.
window.goatcounter.url = function(vars) {
var data = get_data(vars || {})
if (data.p === null) // null from user callback.
return
data.rnd = Math.random().toString(36).substr(2, 5) // Browsers don't always listen to Cache-Control.
var endpoint = get_endpoint()
if (!endpoint)
return warn('no endpoint found')
return endpoint + urlencode(data)
}
// Count a hit.
window.goatcounter.count = function(vars) {
var f = goatcounter.filter()
if (f)
return warn('not counting because of: ' + f)
var url = goatcounter.url(vars)
if (!url)
return warn('not counting because path callback returned null')
if (!navigator.sendBeacon(url)) {
// This mostly fails due to being blocked by CSP; try again with an
// image-based fallback.
var img = document.createElement('img')
img.src = url
img.style.position = 'absolute' // Affect layout less.
img.style.bottom = '0px'
img.style.width = '1px'
img.style.height = '1px'
img.loading = 'eager'
img.setAttribute('alt', '')
img.setAttribute('aria-hidden', 'true')
var rm = function() { if (img && img.parentNode) img.parentNode.removeChild(img) }
img.addEventListener('load', rm, false)
document.body.appendChild(img)
}
}
// Get a query parameter.
window.goatcounter.get_query = function(name) {
var s = location.search.substr(1).split('&')
for (var i = 0; i < s.length; i++)
if (s[i].toLowerCase().indexOf(name.toLowerCase() + '=') === 0)
return s[i].substr(name.length + 1)
}
// Track click events.
window.goatcounter.bind_events = function() {
if (!document.querySelectorAll) // Just in case someone uses an ancient browser.
return
var send = function(elem) {
return function() {
goatcounter.count({
event: true,
path: (elem.dataset.goatcounterClick || elem.name || elem.id || ''),
title: (elem.dataset.goatcounterTitle || elem.title || (elem.innerHTML || '').substr(0, 200) || ''),
referrer: (elem.dataset.goatcounterReferrer || elem.dataset.goatcounterReferral || ''),
})
}
}
Array.prototype.slice.call(document.querySelectorAll("*[data-goatcounter-click]")).forEach(function(elem) {
if (elem.dataset.goatcounterBound)
return
var f = send(elem)
elem.addEventListener('click', f, false)
elem.addEventListener('auxclick', f, false) // Middle click.
elem.dataset.goatcounterBound = 'true'
})
}
// Add a "visitor counter" frame or image.
window.goatcounter.visit_count = function(opt) {
on_load(function() {
opt = opt || {}
opt.type = opt.type || 'html'
opt.append = opt.append || 'body'
opt.path = opt.path || get_path()
opt.attr = opt.attr || {width: '200', height: (opt.no_branding ? '60' : '80')}
opt.attr['src'] = get_endpoint() + 'er/' + enc(opt.path) + '.' + enc(opt.type) + '?'
if (opt.no_branding) opt.attr['src'] += '&no_branding=1'
if (opt.style) opt.attr['src'] += '&style=' + enc(opt.style)
if (opt.start) opt.attr['src'] += '&start=' + enc(opt.start)
if (opt.end) opt.attr['src'] += '&end=' + enc(opt.end)
var tag = {png: 'img', svg: 'img', html: 'iframe'}[opt.type]
if (!tag)
return warn('visit_count: unknown type: ' + opt.type)
if (opt.type === 'html') {
opt.attr['frameborder'] = '0'
opt.attr['scrolling'] = 'no'
}
var d = document.createElement(tag)
for (var k in opt.attr)
d.setAttribute(k, opt.attr[k])
var p = document.querySelector(opt.append)
if (!p)
return warn('visit_count: append not found: ' + opt.append)
p.appendChild(d)
})
}
// Make it easy to skip your own views.
if (location.hash === '#toggle-goatcounter') {
if (localStorage.getItem('skipgc') === 't') {
localStorage.removeItem('skipgc', 't')
alert('GoatCounter tracking is now ENABLED in this browser.')
}
else {
localStorage.setItem('skipgc', 't')
alert('GoatCounter tracking is now DISABLED in this browser until ' + location + ' is loaded again.')
}
}
if (!goatcounter.no_onload)
on_load(function() {
// 1. Page is visible, count request.
// 2. Page is not yet visible; wait until it switches to 'visible' and count.
// See #487
if (!('visibilityState' in document) || document.visibilityState === 'visible')
goatcounter.count()
else {
var f = function(e) {
if (document.visibilityState !== 'visible')
return
document.removeEventListener('visibilitychange', f)
goatcounter.count()
}
document.addEventListener('visibilitychange', f)
}
if (!goatcounter.no_events)
goatcounter.bind_events()
})
})();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 B

After

Width:  |  Height:  |  Size: 817 B

24
public/floaties.js Normal file
View file

@ -0,0 +1,24 @@
document.addEventListener("DOMContentLoaded", () => {
const floaties = document.getElementById("floaties");
if (!floaties) return;
let lastScrollY = 0;
const handleScroll = () => {
const currentScrollY = window.scrollY;
if (currentScrollY > lastScrollY) {
setTimeout(() => {
floaties.classList.add("hidden");
}, 300);
} else {
setTimeout(() => {
floaties.classList.remove("hidden");
}, 400);
}
lastScrollY = currentScrollY;
};
window.addEventListener("scroll", handleScroll);
});

View file

@ -1 +0,0 @@
@font-face{font-style:normal;font-weight:100 900;src:url("fonts/InterVariable.woff2") format("woff2");font-family:"Inter Variable";font-display:swap}@font-face{font-style:italic;font-weight:100 900;src:url("fonts/InterVariable-Italic.woff2") format("woff2");font-family:"Inter Variable";font-display:swap}@font-face{font-style:normal;font-weight:100 900;src:url("fonts/JetBrainsMono.woff2") format("woff2");font-family:"JetBrains Mono";font-display:swap}@font-face{font-style:italic;font-weight:100 900;src:url("fonts/JetBrainsMono-Italic.woff2") format("woff2");font-family:"JetBrains Mono";font-display:swap}body{font-family:"Inter Variable",var(--font-system-ui),var(--font-emoji)}h1,h2,h3,h4,h5,h6{font-weight:bold;font-family:"Inter Variable",var(--font-system-ui),var(--font-emoji)}h1{font-weight:900}pre,code,kbd,samp{font-family:"JetBrains Mono",var(--font-monospace-code)}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/fonts/geist.woff2 Normal file

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -1,88 +1,134 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" >
<head>
<!-- 2025-02-12 Wed 02:30 -->
<meta charset="UTF-8" />
<meta name="description" content="Well, get on this site and find out." />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#9a9996" />
<meta name="base" content="https://rootsource.cc" />
<title>RSCC</title>
<link rel="canonical" href="https://rootsource.cc/" /><link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png" />
<link rel="canonical" href="https://rootsource.cc/" />
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://rootsource.cc/apple-touch-icon.png" />
<style type="text/css">
:root {--accent-color: #6f8396;--contrast-color: #fff;}</style>
<meta content="Zola" name="generator">
<link rel="icon" type="image/png" href="https://rootsource.cc/favicon.png?h=4b8b8481f5ac84986183" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<link rel="preload" href="https://rootsource.cc/fonts/geist.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/geist-mono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://rootsource.cc/fonts/phosphor-bold.woff2" as="font" type="font/woff2" crossorigin><style type="text/css">
:root {
--accent-color: hsl(324 2% 43%);
--accent-h: 324;
--accent-s: 2%;
--accent-l: 43%;
}[data-theme="dark"] {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--accent-color: hsl(0 1% 75%);
--accent-h: 0;
--accent-s: 1%;
--accent-l: 75%;
}
}</style>
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/style.css?h=fd31cab16611d9654aa0" />
<link type="text/css" rel="stylesheet" href="https://rootsource.cc/phosphor-bold.css?h=64fb8156a3a3f0de62c5" />
<script type="text/javascript" defer src="https://rootsource.cc/closable.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search_index.en.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/elasticlunr.min.js"></script>
<script type="text/javascript" defer src="https://rootsource.cc/search.js"></script>
<meta property="og:site_name" content="RSCC" />
<meta property="og:title" content="RSCC" />
<meta property="og:url" content="https://rootsource.cc/" />
<meta property="og:description" content="Well, get on this site and find out." />
<meta property="og:image" content="https://rootsource.cc/card.png" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="RSCC" />
<meta name="twitter:url" content="https://rootsource.cc/" />
<meta name="twitter:description" content="Well, get on this site and find out." />
</head>
<body>
<body >
<header id="site-nav">
<nav>
<a href="#main-content" tabindex="0">
Skip to Main Content
</a>
<ul>
<li id="home">
<a href="https://rootsource.cc"class="active">
<i class="icon"></i>RSCC</a>
</li>
<li class="divider"></li>
<li>
<a href="https://rootsource.cc/Articles">Articles</a>
</li>
<li id="search">
<button id="search-toggle" class="circle" title="Search">
<i class="icon"></i>
</button>
<a id="skip-to-content" href="#main-content" tabindex="0">Skip to Main Content</a>
<div id="site-navbar" class="sidebar">
<a id="navbar-header" href="#top"><i class="ph-bold ph-arrow-line-up"></i><div>
<span>RSCC</span>
<span>Back to Top</span>
</div>
</a>
<nav class="overshoot">
<ul><li>
<a
href="https:&#x2F;&#x2F;rootsource.cc&#x2F;"class="active">
<i class="ph-bold ph-house"></i>RSCC</a>
</li>
</ul>
</nav>
<div id="search-container">
<label for="search-bar" class="visually-hidden">Search</label>
<input id="search-bar" placeholder="Search for…" autocomplete="off" type="search" disabled>
<div id="search-results-container">
<div id="search-results"></div>
</div>
</div>
</header>
<main id="main-content">
<h1 id="rootsourcecc">RootSourceCC</h1>
<p>Welcome to RootSourceCC! You could technically call this: "The child of Raíz1, Icycoide and Costmiku"</p>
<li>
<a href="https://rootsource.cc/Articles" class="
">
<i class="ph-bold ph-newspaper"></i>Articles</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;git.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-git-merge"></i>Alpsource</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;haj.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-fediverse-logo"></i>Hajiku&#x2F;Costkey</a>
</li>
<li>
<a href="https:&#x2F;&#x2F;bin.rootsource.cc&#x2F;" rel="" class="external">
<i class="ph-bold ph-lock-laminated"></i>Estellabin</a>
</li></ul>
</nav>
<div id="navbar-buttons">
<input class="visually-hidden" id="toggle-navbar" type="checkbox" name="toggle-navbar" autocomplete="off" />
<label for="toggle-navbar"><i class="ph-bold ph-sidebar"></i>Toggle Sidebar</label><button id="search">
<i class="ph-bold ph-magnifying-glass"></i>Search</button></div>
</div>
<main id="main-content" class="has-navbar"><div class="container">
<h1>Home - RootSourceCC</h1><p>Welcome to RootSourceCC! You could technically call this: "The child of Raíz1, Icycoide and Costmiku"</p>
<p>With the ownership by Raíz1, hosted on and also being in charge of Costmiku, and hosting Icycoide's stuff!</p>
<p>Links:</p>
<ul>
<li><a href="https://git.rootsource.cc">Alpsource (Git forge)</a></li>
</ul>
<p>Proud to say, we are the <strong>third</strong> website to transition from Duckquill to Ametrine!</p>
<p>-<a href="https://raiz1.noho.st">Raíz1</a> - <a href="https://icycoide.github.io">Icycoide</a> 2025.</p>
<span id="search-index" class="hidden">https://rootsource.cc/search_index.en.json</span>
<span id="more-matches-text" class="hidden">$MATCHES more matches</span>
</div>
</main>
<footer id="site-footer">
<p>raíz1.noho.st owns this website</p>
<p>
<small>Powered by <a class="link external" href="https://www.getzola.org" rel="">Zola</a> and <a class="link external" href="https://duckquill.daudix.one" rel="">Duckquill</a>
</small>
</p>
<div class="container">
<div><p id="site-footer-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">
<i class="ph-bold ph-keyboard" title="Press “&#x2F;” to Open Search Bar"></i>
</div>
<div id="search-results" class="overshoot"></div>
</div>
</div>
</body>
</html>

View file

@ -1,8 +0,0 @@
document.addEventListener("DOMContentLoaded", function () {
renderMathInElement(document.body, {
delimiters: [
{ left: "$$", right: "$$", display: true },
{ left: "$", right: "$", display: false },
],
});
});

File diff suppressed because it is too large Load diff

1
public/katex.min.js vendored

File diff suppressed because one or more lines are too long

4623
public/phosphor-bold.css Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

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.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

View file

@ -1,127 +0,0 @@
// Based on https://codeberg.org/daudix/duckquill/issues/101#issuecomment-2377169
let searchSetup = false;
let fuse;
async function initIndex() {
if (searchSetup) return;
const url = document.getElementById("search-index").textContent;
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const options = {
includeScore: false,
includeMatches: true,
ignoreLocation: true,
threshold: 0.15,
keys: [
{ name: "title", weight: 3 },
{ name: "description", weight: 2 },
{ name: "body", weight: 1 }
]
};
fuse = new Fuse(await response.json(), options);
searchSetup = true;
console.log("Search index initialized successfully");
}
function toggleSearch() {
initIndex();
const searchBar = document.getElementById("search-bar");
const searchContainer = document.getElementById("search-container");
const searchResults = document.getElementById("search-results");
searchContainer.classList.toggle("active");
searchBar.toggleAttribute("disabled");
searchBar.focus();
}
function debounce(actual_fn, wait) {
let timeoutId;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
actual_fn(...args);
}, wait);
};
};
function initSearch() {
const searchBar = document.getElementById("search-bar");
const searchResults = document.getElementById("search-results");
const searchContainer = document.getElementById("search-container");
const MAX_ITEMS = 10;
const MAX_RESULTS = 4;
let currentTerm = "";
searchBar.addEventListener("keyup", (e) => {
const searchVal = searchBar.value.trim();
const results = fuse.search(searchVal, { limit: MAX_ITEMS });
let html = "";
for (const result of results) {
html += makeTeaser(result, searchVal);
}
searchResults.innerHTML = html;
if (html) {
searchResults.style.display = "flex";
} else {
searchResults.style.display = "none";
}
});
function makeTeaser(result, searchVal) {
const TEASER_SIZE = 20;
let output = `<div class="search-result item"><a class="result-title" href=${result.item.url}>${result.item.title}</a>`;
for (const match of result.matches) {
if (match.key === "title") continue;
const indices = match.indices.sort((a, b) => Math.abs(a[1] - a[0] - searchVal.length) - Math.abs(b[1] - b[0] - searchVal.length)).slice(0, MAX_RESULTS);
const value = match.value;
for (const ind of indices) {
const start = Math.max(0, ind[0] - TEASER_SIZE);
const end = Math.min(value.length - 1, ind[1] + TEASER_SIZE);
output += "<span>"
+ value.substring(start, ind[0])
+ `<strong>${value.substring(ind[0], ind[1] + 1)}</strong>`
+ value.substring(ind[1] + 1, end)
+ "</span>";
}
if (match.indices.length > 4) {
const moreMatchesText = document.getElementById("more-matches-text").textContent;
output += `<span class="more-matches">${moreMatchesText}</span>`.replace("$MATCHES", `+${match.indices.length - MAX_RESULTS}`);
}
}
return output + "</div>";
}
/*window.addEventListener("click", function (event) {
if (searchSetup && searchBar.getAttribute("disabled") === null && !searchContainer.contains(event.target)) {
toggleSearch();
}
}, { passive: true });*/
document.addEventListener("keydown", function(event) {
if (event.key === "/") {
event.preventDefault();
toggleSearch();
}
});
document.getElementById("search-toggle").addEventListener("click", toggleSearch);
}
if (document.readyState === "complete" ||
(document.readyState !== "loading" && !document.documentElement.doScroll))
initSearch();
else
document.addEventListener("DOMContentLoaded", initSearch);

View file

@ -1,16 +1,18 @@
// Based on https://github.com/getzola/zola/blob/1ac1231de1e342bbaf4d7a51a8a9a40ea152e246/docs/static/search.js
function debounce(func, wait) {
// 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;
var args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
func.apply(context, args);
}, wait);
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
@ -123,6 +125,7 @@ function makeTeaser(body, terms) {
}
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>`
@ -130,9 +133,11 @@ function formatSearchResultItem(item, terms) {
}
function initSearch() {
var searchBar = document.getElementById("search-bar");
var searchContainer = document.getElementById("search-container");
var searchResults = document.getElementById("search-results");
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 = {
@ -147,29 +152,67 @@ function initSearch() {
var initIndex = async function () {
if (index === undefined) {
let searchIndex = document.getElementById("search-index").textContent;
index = fetch(searchIndex)
.then(
async function (response) {
return await elasticlunr.Index.load(await response.json());
}
);
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());
}
}
let res = await index;
return res;
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 });
});
}
searchBar.addEventListener("keyup", debounce(async function () {
var term = searchBar.value.trim();
if (term === currentTerm) {
return;
// 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 = "";
searchResults.innerHTML = ""; // Clear previous results
currentTerm = term;
if (term === "") {
return;
}
if (term === "") return;
var results = (await initIndex()).search(term, options);
if (results.length === 0) {
@ -177,27 +220,11 @@ function initSearch() {
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));
document.addEventListener("keydown", function (event) {
if (event.key === "/") {
event.preventDefault();
toggleSearch();
}
});
document.getElementById("search-toggle").addEventListener("click", toggleSearch);
}
function toggleSearch() {
var searchContainer = document.getElementById("search-container");
var searchBar = document.getElementById("search-bar");
searchContainer.classList.toggle("active");
searchBar.toggleAttribute("disabled");
searchBar.focus();
}
if (document.readyState === "complete" ||

File diff suppressed because one or more lines are too long

View file

@ -6,9 +6,20 @@
<url>
<loc>https://rootsource.cc/Articles/</loc>
</url>
<url>
<loc>https://rootsource.cc/Articles/duckquill2ametrine/</loc>
<lastmod>2025-03-04</lastmod>
</url>
<url>
<loc>https://rootsource.cc/Articles/page/1/</loc>
</url>
<url>
<loc>https://rootsource.cc/Articles/page/2/</loc>
</url>
<url>
<loc>https://rootsource.cc/Articles/set-up-costmiku-ffsync/</loc>
<lastmod>2025-03-01</lastmod>
</url>
<url>
<loc>https://rootsource.cc/Articles/tylkolinux-installation/</loc>
<lastmod>2025-01-30</lastmod>

File diff suppressed because one or more lines are too long

View file

@ -1,283 +1,78 @@
/*
* theme "Solarized (dark)" generated by syntect
* theme "Monokai Pro" generated by syntect
*/
.z-code {
color: #839496;
background-color: #002b36;
color: #fcfcfa;
background-color: #2d2a2e;
}
.z-comment, .z-meta.z-documentation {
color: #586e75;
.z-comment {
color: #727072;
}
.z-string {
color: #2aa198;
}
.z-string.z-regexp {
color: #2aa198;
}
.z-constant.z-character.z-escape {
color: #dc322f;
color: #ffd866;
}
.z-constant.z-numeric {
color: #6c71c4;
color: #ab9df2;
}
.z-variable {
color: #268bd2;
}
.z-variable.z-function {
color: #b58900;
}
.z-variable.z-language {
color: #d33682;
}
.z-keyword {
color: #859900;
}
.z-meta.z-import .z-keyword, .z-keyword.z-control.z-import, .z-keyword.z-control.z-import.z-from, .z-keyword.z-other.z-import, .z-keyword.z-control.z-at-rule.z-include, .z-keyword.z-control.z-at-rule.z-import {
color: #cb4b16;
}
.z-keyword.z-operator.z-comparison, .z-keyword.z-operator.z-assignment, .z-keyword.z-operator.z-arithmetic {
color: #657b83;
}
.z-storage {
color: #859900;
}
.z-storage.z-modifier {
color: #93a1a1;
}
.z-keyword.z-control.z-class, .z-entity.z-name, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class {
color: #b58900;
}
.z-entity.z-other.z-inherited-class {
color: #268bd2;
}
.z-entity.z-other.z-attribute-name {
color: #b58900;
}
.z-support, .z-support.z-type, .z-support.z-class {
color: #859900;
}
.z-entity.z-name.z-function {
color: #b58900;
}
.z-punctuation.z-definition.z-variable {
color: #859900;
}
.z-constant, .z-constant.z-language, .z-meta.z-preprocessor {
color: #b58900;
}
.z-entity.z-name.z-section {
color: #cb4b16;
}
.z-support.z-function.z-construct, .z-keyword.z-other.z-new {
color: #dc322f;
.z-constant.z-language {
color: #ab9df2;
}
.z-constant.z-character, .z-constant.z-other {
color: #cb4b16;
color: #ab9df2;
}
.z-entity.z-name.z-tag {
color: #268bd2;
.z-variable {
}
.z-punctuation.z-definition.z-tag.z-html, .z-punctuation.z-definition.z-tag.z-begin, .z-punctuation.z-definition.z-tag.z-end {
color: #586e75;
.z-keyword {
color: #ff6188;
}
.z-support.z-function {
color: #859900;
}
.z-punctuation.z-separator.z-continuation {
color: #dc322f;
.z-storage {
color: #ff6188;
}
.z-storage.z-type {
color: #268bd2;
}
.z-support.z-type.z-exception {
color: #cb4b16;
}
.z-keyword.z-other.z-special-method {
color: #cb4b16;
}
.z-invalid {
background-color: #6e2e32;
}
.z-string.z-quoted.z-double, .z-string.z-quoted.z-single {
color: #2aa198;
}
.z-punctuation.z-definition.z-string {
color: #839496;
}
.z-meta.z-brace.z-square, .z-punctuation.z-section.z-brackets {
color: #268bd2;
}
.z-meta.z-brace.z-round, .z-meta.z-brace.z-curly, .z-punctuation.z-section, .z-punctuation.z-section.z-block, .z-punctuation.z-definition.z-parameters, .z-punctuation.z-section.z-group {
color: #657b83;
}
.z-support.z-constant.z-color, .z-invalid.z-deprecated.z-color.z-w3c-non-standard-color-name.z-scss {
color: #b58900;
}
.z-meta.z-selector.z-css {
color: #657b83;
}
.z-entity.z-name.z-tag.z-css, .z-entity.z-name.z-tag.z-scss, .z-source.z-less .z-keyword.z-control.z-html.z-elements, .z-source.z-sass .z-keyword.z-control.z-untitled {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-class {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-id {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-pseudo-class, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-class {
color: #268bd2;
}
.z-text.z-html.z-basic .z-meta.z-tag.z-other.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-any.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-block.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-inline.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-structure.z-any.z-html, .z-text.z-html.z-basic .z-source.z-js.z-embedded.z-html, .z-punctuation.z-separator.z-key-value.z-html {
color: #657b83;
}
.z-text.z-html.z-basic .z-entity.z-other.z-attribute-name.z-html, .z-meta.z-tag.z-xml .z-entity.z-other.z-attribute-name {
color: #b58900;
}
.z-keyword.z-other.z-special-method.z-ruby {
color: #859900;
}
.z-variable.z-other.z-constant.z-ruby {
color: #b58900;
}
.z-constant.z-other.z-symbol.z-ruby {
color: #2aa198;
}
.z-keyword.z-other.z-special-method.z-ruby {
color: #cb4b16;
}
.z-meta.z-array .z-support.z-function.z-construct.z-php {
color: #b58900;
}
.z-entity.z-name.z-function.z-preprocessor.z-c, .z-meta.z-preprocessor.z-c.z-include, .z-meta.z-preprocessor.z-macro.z-c {
color: #cb4b16;
}
.z-meta.z-preprocessor.z-c.z-include .z-string.z-quoted.z-other.z-lt-gt.z-include.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-begin.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-end.z-c {
color: #2aa198;
}
.z-other.z-package.z-exclude, .z-other.z-remove {
color: #dc322f;
}
.z-other.z-add {
color: #2aa198;
}
.z-punctuation.z-section.z-group.z-tex, .z-punctuation.z-definition.z-arguments.z-begin.z-latex, .z-punctuation.z-definition.z-arguments.z-end.z-latex, .z-punctuation.z-definition.z-arguments.z-latex {
color: #dc322f;
}
.z-meta.z-group.z-braces.z-tex {
color: #b58900;
}
.z-string.z-other.z-math.z-tex {
color: #b58900;
}
.z-variable.z-parameter.z-function.z-latex {
color: #cb4b16;
}
.z-punctuation.z-definition.z-constant.z-math.z-tex {
color: #dc322f;
}
.z-text.z-tex.z-latex .z-constant.z-other.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-character.z-math.z-tex {
color: #2aa198;
}
.z-string.z-other.z-math.z-tex {
color: #b58900;
}
.z-punctuation.z-definition.z-string.z-begin.z-tex, .z-punctuation.z-definition.z-string.z-end.z-tex {
color: #dc322f;
}
.z-keyword.z-control.z-label.z-latex, .z-text.z-tex.z-latex .z-constant.z-other.z-general.z-math.z-tex {
color: #2aa198;
}
.z-variable.z-parameter.z-definition.z-label.z-latex {
color: #dc322f;
}
.z-support.z-function.z-be.z-latex {
color: #859900;
}
.z-support.z-function.z-section.z-latex {
color: #cb4b16;
}
.z-support.z-function.z-general.z-tex {
color: #2aa198;
}
.z-keyword.z-control.z-ref.z-latex {
color: #2aa198;
}
.z-storage.z-type.z-class.z-python, .z-storage.z-type.z-function.z-python, .z-storage.z-modifier.z-global.z-python {
color: #859900;
}
.z-support.z-type.z-exception.z-python {
color: #b58900;
}
.z-meta.z-scope.z-for-in-loop.z-shell, .z-variable.z-other.z-loop.z-shell {
color: #93a1a1;
}
.z-meta.z-scope.z-case-block.z-shell, .z-meta.z-scope.z-case-body.z-shell {
color: #93a1a1;
}
.z-punctuation.z-definition.z-logical-expression.z-shell {
color: #dc322f;
}
.z-storage.z-modifier.z-c++ {
color: #859900;
}
.z-support.z-function.z-perl {
color: #268bd2;
}
.z-meta.z-diff, .z-meta.z-diff.z-header {
color: #586e75;
}
.z-meta.z-diff.z-range {
color: #268bd2;
}
.z-markup.z-deleted {
color: #dc322f;
}
.z-markup.z-changed {
color: #b58900;
}
.z-markup.z-inserted {
color: #859900;
}
.z-markup.z-warning {
color: #b58900;
}
.z-markup.z-error {
color: #dc322f;
}
.z-markup.z-heading, .z-punctuation.z-definition.z-heading.z-markdown {
color: #b58900;
font-weight: bold;
}
.z-markup.z-quote {
color: #859900;
}
.z-markup.z-italic {
color: #78dce8;
font-style: italic;
}
.z-markup.z-bold {
font-weight: bold;
.z-entity.z-name.z-class {
color: #a9dc76;
text-decoration: underline;
}
.z-markup.z-underline.z-link.z-markdown, .z-meta.z-link.z-reference .z-constant.z-other.z-reference.z-link.z-markdown {
color: #2aa198;
.z-entity.z-other.z-inherited-class {
color: #a9dc76;
text-decoration: underline;
font-style: italic;
}
.z-constant.z-other.z-reference.z-link.z-markdown {
color: #6c71c4;
.z-entity.z-name.z-function {
color: #a9dc76;
}
.z-meta.z-paragraph.z-markdown .z-meta.z-dummy.z-line-break {
background-color: #586e75;
.z-variable.z-parameter {
color: #fc9867;
font-style: italic;
}
.z-brackethighlighter.z-all {
color: #586e75;
.z-entity.z-name.z-tag {
color: #ff6188;
}
.z-entity.z-name.z-filename.z-find-in-files {
color: #2aa198;
.z-entity.z-other.z-attribute-name {
color: #a9dc76;
font-style: italic;
}
.z-constant.z-numeric.z-line-number.z-find-in-files {
color: #586e75;
.z-support.z-function {
color: #78dce8;
}
.z-variable.z-other.z-readwrite.z-js, .z-variable.z-other.z-object.z-js, .z-variable.z-other.z-constant.z-js {
color: #839496;
.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

@ -1,283 +1,78 @@
/*
* theme "Solarized (light)" generated by syntect
* theme "Monokai Pro Light" generated by syntect
*/
.z-code {
color: #657b83;
background-color: #fdf6e3;
color: #29242a;
background-color: #faf4f2;
}
.z-comment, .z-meta.z-documentation {
color: #93a1a1;
.z-comment {
color: #918c8e;
}
.z-string {
color: #2aa198;
}
.z-string.z-regexp {
color: #2aa198;
}
.z-constant.z-character.z-escape {
color: #dc322f;
color: #cc7a0a;
}
.z-constant.z-numeric {
color: #6c71c4;
color: #7058be;
}
.z-variable {
color: #268bd2;
}
.z-variable.z-function {
color: #b58900;
}
.z-variable.z-language {
color: #d33682;
}
.z-keyword {
color: #859900;
}
.z-meta.z-import .z-keyword, .z-keyword.z-control.z-import, .z-keyword.z-control.z-import.z-from, .z-keyword.z-other.z-import, .z-keyword.z-control.z-at-rule.z-include, .z-keyword.z-control.z-at-rule.z-import {
color: #cb4b16;
}
.z-keyword.z-operator.z-comparison, .z-keyword.z-operator.z-assignment, .z-keyword.z-operator.z-arithmetic {
color: #657b83;
}
.z-storage {
color: #859900;
}
.z-storage.z-modifier {
color: #586e75;
}
.z-keyword.z-control.z-class, .z-entity.z-name, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class {
color: #b58900;
}
.z-entity.z-other.z-inherited-class {
color: #268bd2;
}
.z-entity.z-other.z-attribute-name {
color: #b58900;
}
.z-support, .z-support.z-type, .z-support.z-class {
color: #859900;
}
.z-entity.z-name.z-function {
color: #b58900;
}
.z-punctuation.z-definition.z-variable {
color: #859900;
}
.z-constant, .z-constant.z-language, .z-meta.z-preprocessor {
color: #b58900;
}
.z-entity.z-name.z-section {
color: #cb4b16;
}
.z-support.z-function.z-construct, .z-keyword.z-other.z-new {
color: #dc322f;
.z-constant.z-language {
color: #7058be;
}
.z-constant.z-character, .z-constant.z-other {
color: #cb4b16;
color: #7058be;
}
.z-entity.z-name.z-tag {
color: #268bd2;
.z-variable {
}
.z-punctuation.z-definition.z-tag.z-html, .z-punctuation.z-definition.z-tag.z-begin, .z-punctuation.z-definition.z-tag.z-end {
color: #93a1a1;
.z-keyword {
color: #e14775;
}
.z-support.z-function {
color: #859900;
}
.z-punctuation.z-separator.z-continuation {
color: #dc322f;
.z-storage {
color: #e14775;
}
.z-storage.z-type {
color: #268bd2;
}
.z-support.z-type.z-exception {
color: #cb4b16;
}
.z-keyword.z-other.z-special-method {
color: #cb4b16;
}
.z-invalid {
background-color: #ec9489;
}
.z-string.z-quoted.z-double, .z-string.z-quoted.z-single {
color: #2aa198;
}
.z-punctuation.z-definition.z-string {
color: #839496;
}
.z-meta.z-brace.z-square, .z-punctuation.z-section.z-brackets {
color: #268bd2;
}
.z-meta.z-brace.z-round, .z-meta.z-brace.z-curly, .z-punctuation.z-section, .z-punctuation.z-section.z-block, .z-punctuation.z-definition.z-parameters, .z-punctuation.z-section.z-group {
color: #657b83;
}
.z-support.z-constant.z-color, .z-invalid.z-deprecated.z-color.z-w3c-non-standard-color-name.z-scss {
color: #b58900;
}
.z-meta.z-selector.z-css {
color: #657b83;
}
.z-entity.z-name.z-tag.z-css, .z-entity.z-name.z-tag.z-scss, .z-source.z-less .z-keyword.z-control.z-html.z-elements, .z-source.z-sass .z-keyword.z-control.z-untitled {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-class {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-id {
color: #b58900;
}
.z-entity.z-other.z-attribute-name.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-pseudo-class, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-class {
color: #268bd2;
}
.z-text.z-html.z-basic .z-meta.z-tag.z-other.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-any.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-block.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-inline.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-structure.z-any.z-html, .z-text.z-html.z-basic .z-source.z-js.z-embedded.z-html, .z-punctuation.z-separator.z-key-value.z-html {
color: #657b83;
}
.z-text.z-html.z-basic .z-entity.z-other.z-attribute-name.z-html, .z-meta.z-tag.z-xml .z-entity.z-other.z-attribute-name {
color: #b58900;
}
.z-keyword.z-other.z-special-method.z-ruby {
color: #859900;
}
.z-variable.z-other.z-constant.z-ruby {
color: #b58900;
}
.z-constant.z-other.z-symbol.z-ruby {
color: #2aa198;
}
.z-keyword.z-other.z-special-method.z-ruby {
color: #cb4b16;
}
.z-meta.z-array .z-support.z-function.z-construct.z-php {
color: #b58900;
}
.z-entity.z-name.z-function.z-preprocessor.z-c, .z-meta.z-preprocessor.z-c.z-include, .z-meta.z-preprocessor.z-macro.z-c {
color: #cb4b16;
}
.z-meta.z-preprocessor.z-c.z-include .z-string.z-quoted.z-other.z-lt-gt.z-include.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-begin.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-end.z-c {
color: #2aa198;
}
.z-other.z-package.z-exclude, .z-other.z-remove {
color: #dc322f;
}
.z-other.z-add {
color: #2aa198;
}
.z-punctuation.z-section.z-group.z-tex, .z-punctuation.z-definition.z-arguments.z-begin.z-latex, .z-punctuation.z-definition.z-arguments.z-end.z-latex, .z-punctuation.z-definition.z-arguments.z-latex {
color: #dc322f;
}
.z-meta.z-group.z-braces.z-tex {
color: #b58900;
}
.z-string.z-other.z-math.z-tex {
color: #b58900;
}
.z-variable.z-parameter.z-function.z-latex {
color: #cb4b16;
}
.z-punctuation.z-definition.z-constant.z-math.z-tex {
color: #dc322f;
}
.z-text.z-tex.z-latex .z-constant.z-other.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-character.z-math.z-tex {
color: #2aa198;
}
.z-string.z-other.z-math.z-tex {
color: #b58900;
}
.z-punctuation.z-definition.z-string.z-begin.z-tex, .z-punctuation.z-definition.z-string.z-end.z-tex {
color: #dc322f;
}
.z-keyword.z-control.z-label.z-latex, .z-text.z-tex.z-latex .z-constant.z-other.z-general.z-math.z-tex {
color: #2aa198;
}
.z-variable.z-parameter.z-definition.z-label.z-latex {
color: #dc322f;
}
.z-support.z-function.z-be.z-latex {
color: #859900;
}
.z-support.z-function.z-section.z-latex {
color: #cb4b16;
}
.z-support.z-function.z-general.z-tex {
color: #2aa198;
}
.z-keyword.z-control.z-ref.z-latex {
color: #2aa198;
}
.z-storage.z-type.z-class.z-python, .z-storage.z-type.z-function.z-python, .z-storage.z-modifier.z-global.z-python {
color: #859900;
}
.z-support.z-type.z-exception.z-python {
color: #b58900;
}
.z-meta.z-scope.z-for-in-loop.z-shell, .z-variable.z-other.z-loop.z-shell {
color: #586e75;
}
.z-meta.z-scope.z-case-block.z-shell, .z-meta.z-scope.z-case-body.z-shell {
color: #586e75;
}
.z-punctuation.z-definition.z-logical-expression.z-shell {
color: #dc322f;
}
.z-storage.z-modifier.z-c++ {
color: #859900;
}
.z-support.z-function.z-perl {
color: #268bd2;
}
.z-meta.z-diff, .z-meta.z-diff.z-header {
color: #93a1a1;
}
.z-meta.z-diff.z-range {
color: #268bd2;
}
.z-markup.z-deleted {
color: #dc322f;
}
.z-markup.z-changed {
color: #b58900;
}
.z-markup.z-inserted {
color: #859900;
}
.z-markup.z-warning {
color: #b58900;
}
.z-markup.z-error {
color: #dc322f;
}
.z-markup.z-heading, .z-punctuation.z-definition.z-heading.z-markdown {
color: #b58900;
font-weight: bold;
}
.z-markup.z-quote {
color: #859900;
}
.z-markup.z-italic {
color: #1c8ca8;
font-style: italic;
}
.z-markup.z-bold {
font-weight: bold;
.z-entity.z-name.z-class {
color: #269d69;
text-decoration: underline;
}
.z-markup.z-underline.z-link.z-markdown, .z-meta.z-link.z-reference .z-constant.z-other.z-reference.z-link.z-markdown {
color: #2aa198;
.z-entity.z-other.z-inherited-class {
color: #269d69;
text-decoration: underline;
font-style: italic;
}
.z-constant.z-other.z-reference.z-link.z-markdown {
color: #6c71c4;
.z-entity.z-name.z-function {
color: #269d69;
}
.z-meta.z-paragraph.z-markdown .z-meta.z-dummy.z-line-break {
background-color: #eee8d5;
.z-variable.z-parameter {
color: #e16032;
font-style: italic;
}
.z-brackethighlighter.z-all {
color: #93a1a1;
.z-entity.z-name.z-tag {
color: #e14775;
}
.z-entity.z-name.z-filename.z-find-in-files {
color: #2aa198;
.z-entity.z-other.z-attribute-name {
color: #269d69;
font-style: italic;
}
.z-constant.z-numeric.z-line-number.z-find-in-files {
color: #93a1a1;
.z-support.z-function {
color: #1c8ca8;
}
.z-variable.z-other.z-readwrite.z-js, .z-variable.z-other.z-object.z-js, .z-variable.z-other.z-constant.z-js {
color: #657b83;
.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;
}

View file

@ -1,104 +0,0 @@
// Theme Initialization
(function () {
// Get the default theme from the HTML data-theme attribute.
const defaultTheme = document.documentElement.getAttribute("data-theme");
// Set the data-default-theme attribute only if defaultTheme is not null.
if (defaultTheme) {
document.documentElement.setAttribute("data-default-theme", defaultTheme);
}
// Attempt to retrieve the current theme from the browser's local storage.
const storedTheme = localStorage.getItem("theme");
if (storedTheme && storedTheme !== "system") {
document.documentElement.setAttribute("data-theme", storedTheme);
} else if (defaultTheme && storedTheme !== "system") {
document.documentElement.setAttribute("data-theme", defaultTheme);
} else {
// If no theme is found in local storage and no default theme is set, hand over control to the CSS.
document.documentElement.removeAttribute("data-theme");
}
// Expose defaultTheme to the outer scope.
window.defaultTheme = defaultTheme;
})();
// Icon Update and Theme Switching
function setTheme(theme, saveToLocalStorage = false) {
if (theme === "system") {
document.documentElement.removeAttribute("data-theme");
} else {
document.documentElement.setAttribute("data-theme", theme);
}
if (saveToLocalStorage) {
localStorage.setItem("theme", theme);
} else {
localStorage.removeItem("theme");
}
// Update icon class based on the selected theme.
updateIconClass(theme);
// Update the active button based on the selected theme.
updateActiveButton(theme);
}
function resetTheme() {
// Reset the theme to the default or system preference if no default is set.
setTheme(window.defaultTheme || "system");
}
function switchTheme(theme) {
if (theme === "system") {
resetTheme();
} else {
setTheme(theme, true);
}
}
function updateIconClass(theme) {
const iconElement = document.querySelector("#theme-switcher summary .icon");
// Remove any existing theme classes
iconElement.classList.remove("light", "dark");
// Add the appropriate class based on the selected theme
if (theme === "light") {
iconElement.classList.add("light");
} else if (theme === "dark") {
iconElement.classList.add("dark");
}
}
function updateActiveButton(theme) {
// Remove .active class from all buttons
document.querySelectorAll('#theme-switcher button').forEach(button => {
button.classList.remove('active');
});
// Add .active class to the button corresponding to the current theme
const activeButton = document.querySelector(`#theme-${theme}`);
if (activeButton) {
activeButton.classList.add('active');
}
}
document.getElementById("theme-light").addEventListener("click", function () {
switchTheme("light");
});
document.getElementById("theme-dark").addEventListener("click", function () {
switchTheme("dark");
});
document.getElementById("theme-system").addEventListener("click", function () {
switchTheme("system");
});
// Update icon class on page load based on current theme
const currentTheme = localStorage.getItem("theme") || window.defaultTheme || "system";
updateIconClass(currentTheme);
updateActiveButton(currentTheme);
// Make the switchTheme function accessible globally
window.switchTheme = switchTheme;

1
themes/ametrine Submodule

@ -0,0 +1 @@
Subproject commit 670c69556d40a5d5ca1ba372696154786d35b8c7