bring up to date

This commit is contained in:
Clove 2026-06-02 20:19:26 +01:00
parent 28d6d3b64a
commit 6442669774
32 changed files with 528 additions and 0 deletions

38
css/themes/frappe.css Normal file
View File

@ -0,0 +1,38 @@
/* Catppuccin Frappé official palette
https://github.com/catppuccin/catppuccin (dark) */
html[data-flavor="frappe"] {
color-scheme: dark;
/* accents */
--rosewater: #f2d5cf;
--flamingo: #eebebe;
--pink: #f4b8e4;
--accent-rgb: 244, 184, 228; /* live accent default = theme pink */
--mauve: #ca9ee6;
--red: #e78284;
--maroon: #ea999c;
--peach: #ef9f76;
--yellow: #e5c890;
--green: #a6d189;
--teal: #81c8be;
--sky: #99d1db;
--saphire: #85c1dc;
--blue: #8caaee;
--lavender: #babbf1;
/* text */
--text: #c6d0f5;
--subtext-1: #b5bfe2;
--subtext-0: #a5adce;
--overlay-2: #949cbb;
--overlay-1: #838ba7;
--overlay-0: #737994;
/* surfaces + backgrounds */
--surface-2: #626880;
--surface-1: #51576d;
--surface-0: #414559;
--base: #303446;
--mantle: #292c3c;
--crust: #232634;
}

56
css/themes/latte.css Normal file
View File

@ -0,0 +1,56 @@
/* Catppuccin Latte official palette
https://github.com/catppuccin/catppuccin (light) */
html[data-flavor="latte"] {
color-scheme: light;
/* accents */
--rosewater: #dc8a78;
--flamingo: #dd7878;
--pink: #ea76cb;
--accent-rgb: 234, 118, 203; /* live accent default = theme pink */
--mauve: #8839ef;
--red: #d20f39;
--maroon: #e64553;
--peach: #fe640b;
--yellow: #df8e1d;
--green: #40a02b;
--teal: #179299;
--sky: #04a5e5;
--saphire: #209fb5;
--blue: #1e66f5;
--lavender: #7287fd;
/* text */
--text: #4c4f69;
--subtext-1: #5c5f77;
--subtext-0: #6c6f85;
--overlay-2: #7c7f93;
--overlay-1: #8c8fa1;
--overlay-0: #9ca0b0;
/* surfaces + backgrounds */
--surface-2: #acb0be;
--surface-1: #bcc0cc;
--surface-0: #ccd0da;
--base: #eff1f5;
--mantle: #e6e9ef;
--crust: #dce0e8;
}
/* Light-mode readability fixes (icons are white-filtered by default) */
html[data-flavor="latte"] .icon {
filter: brightness(0);
}
html[data-flavor="latte"] .link-card:hover .icon {
filter: none;
}
html[data-flavor="latte"] .badge-icon {
filter: none;
}
html[data-flavor="latte"] body::before {
filter: invert(14%) sepia(0.2) saturate(300%) hue-rotate(200deg) brightness(1.3);
opacity: 0.05;
}

38
css/themes/macchiato.css Normal file
View File

@ -0,0 +1,38 @@
/* Catppuccin Macchiato official palette
https://github.com/catppuccin/catppuccin (dark) */
html[data-flavor="macchiato"] {
color-scheme: dark;
/* accents */
--rosewater: #f4dbd6;
--flamingo: #f0c6c6;
--pink: #f5bde6;
--accent-rgb: 245, 189, 230; /* live accent default = theme pink */
--mauve: #c6a0f6;
--red: #ed8796;
--maroon: #ee99a0;
--peach: #f5a97f;
--yellow: #eed49f;
--green: #a6da95;
--teal: #8bd5ca;
--sky: #91d7e3;
--saphire: #7dc4e4;
--blue: #8aadf4;
--lavender: #b7bdf8;
/* text */
--text: #cad3f5;
--subtext-1: #b8c0e0;
--subtext-0: #a5adcb;
--overlay-2: #939ab7;
--overlay-1: #8087a2;
--overlay-0: #6e738d;
/* surfaces + backgrounds */
--surface-2: #5b6078;
--surface-1: #494d64;
--surface-0: #363a4f;
--base: #24273a;
--mantle: #1e2030;
--crust: #181926;
}

38
css/themes/mocha.css Normal file
View File

@ -0,0 +1,38 @@
/* Catppuccin Mocha official palette
https://github.com/catppuccin/catppuccin (dark, default) */
html[data-flavor="mocha"] {
color-scheme: dark;
/* accents */
--rosewater: #f5e0dc;
--flamingo: #f2cdcd;
--pink: #f5c2e7;
--accent-rgb: 245, 194, 231; /* live accent default = theme pink */
--mauve: #cba6f7;
--red: #f38ba8;
--maroon: #eba0ac;
--peach: #fab387;
--yellow: #f9e2af;
--green: #a6e3a1;
--teal: #94e2d5;
--sky: #89dceb;
--saphire: #74c7ec;
--blue: #89b4fa;
--lavender: #b4befe;
/* Text */
--text: #cdd6f4;
--subtext-0: #a6adc8;
--subtext-1: #bac2de;
--overlay-0: #6c7086;
--overlay-1: #7f849c;
--overlay-2: #9399b2;
--surface-0: #313244;
--surface-1: #45475a;
--surface-2: #585b70;
/* Backgrounds */
--base: #1e1e2e;
--mantle: #181825;
--crust: #11111b;
}

BIN
images/favicon/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 KiB

BIN
images/favicon/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

3
images/misc/amd.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-amd" viewBox="0 0 16 16">
<path d="m.334 0 4.358 4.359h7.15v7.15l4.358 4.358V0zM.2 9.72l4.487-4.488v6.281h6.28L6.48 16H.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 230 B

4
images/misc/apple.svg Normal file
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-apple" viewBox="0 0 16 16">
<path d="M11.182.008C11.148-.03 9.923.023 8.857 1.18c-1.066 1.156-.902 2.482-.878 2.516s1.52.087 2.475-1.258.762-2.391.728-2.43m3.314 11.733c-.048-.096-2.325-1.234-2.113-3.422s1.675-2.789 1.698-2.854-.597-.79-1.254-1.157a3.7 3.7 0 0 0-1.563-.434c-.108-.003-.483-.095-1.254.116-.508.139-1.653.589-1.968.607-.316.018-1.256-.522-2.267-.665-.647-.125-1.333.131-1.824.328-.49.196-1.422.754-2.074 2.237-.652 1.482-.311 3.83-.067 4.56s.625 1.924 1.273 2.796c.576.984 1.34 1.667 1.659 1.899s1.219.386 1.843.067c.502-.308 1.408-.485 1.766-.472.357.013 1.061.154 1.782.539.571.197 1.111.115 1.652-.105.541-.221 1.324-1.059 2.238-2.758q.52-1.185.473-1.282"/>
<path d="M11.182.008C11.148-.03 9.923.023 8.857 1.18c-1.066 1.156-.902 2.482-.878 2.516s1.52.087 2.475-1.258.762-2.391.728-2.43m3.314 11.733c-.048-.096-2.325-1.234-2.113-3.422s1.675-2.789 1.698-2.854-.597-.79-1.254-1.157a3.7 3.7 0 0 0-1.563-.434c-.108-.003-.483-.095-1.254.116-.508.139-1.653.589-1.968.607-.316.018-1.256-.522-2.267-.665-.647-.125-1.333.131-1.824.328-.49.196-1.422.754-2.074 2.237-.652 1.482-.311 3.83-.067 4.56s.625 1.924 1.273 2.796c.576.984 1.34 1.667 1.659 1.899s1.219.386 1.843.067c.502-.308 1.408-.485 1.766-.472.357.013 1.061.154 1.782.539.571.197 1.111.115 1.652-.105.541-.221 1.324-1.059 2.238-2.758q.52-1.185.473-1.282"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

3
images/misc/arch.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640">
<path d="M320.7 56.2C296.6 115.2 282.1 153.9 255.3 211.2C271.7 228.6 291.9 248.8 324.7 271.7C289.5 257.2 265.5 242.8 247.5 227.7C213.2 299.3 159.4 401.2 50.3 597.1C136 547.6 202.5 517.1 264.4 505.5C261.7 494.1 260.3 481.7 260.4 468.8L260.5 466.1C261.9 411.2 290.4 368.9 324.3 371.7C358.2 374.5 384.5 421.5 383.1 476.4C382.8 486.7 381.7 496.6 379.7 505.8C440.9 517.8 506.7 548.2 591.3 597C574.6 566.3 559.7 538.7 545.5 512.3C523.1 494.9 499.8 472.4 452.2 447.9C484.9 456.4 508.5 466.2 526.7 477.2C382.2 208.1 370.5 172.4 320.9 56.1z"/>
</svg>

After

Width:  |  Height:  |  Size: 604 B

3
images/misc/debian.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
images/misc/oneko.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#0085FF" class="bi bi-bluesky" viewBox="0 0 16 16">
<path d="M3.468 1.948C5.303 3.325 7.276 6.118 8 7.616c.725-1.498 2.698-4.29 4.532-5.668C13.855.955 16 .186 16 2.632c0 .489-.28 4.105-.444 4.692-.572 2.04-2.653 2.561-4.504 2.246 3.236.551 4.06 2.375 2.281 4.2-3.376 3.464-4.852-.87-5.23-1.98-.07-.204-.103-.3-.103-.218 0-.081-.033.014-.102.218-.379 1.11-1.855 5.444-5.231 1.98-1.778-1.825-.955-3.65 2.28-4.2-1.85.315-3.932-.205-4.503-2.246C.28 6.737 0 3.12 0 2.632 0 .186 2.145.955 3.468 1.948"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#5865F2" class="bi bi-discord" viewBox="0 0 16 16">
<path d="M13.545 2.907a13.2 13.2 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.2 12.2 0 0 0-3.658 0 8 8 0 0 0-.412-.833.05.05 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.04.04 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032q.003.022.021.037a13.3 13.3 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019q.463-.63.818-1.329a.05.05 0 0 0-.01-.059l-.018-.011a9 9 0 0 1-1.248-.595.05.05 0 0 1-.02-.066l.015-.019q.127-.095.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.05.05 0 0 1 .053.007q.121.1.248.195a.05.05 0 0 1-.004.085 8 8 0 0 1-1.249.594.05.05 0 0 0-.03.03.05.05 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.2 13.2 0 0 0 4.001-2.02.05.05 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.03.03 0 0 0-.02-.019m-8.198 7.307c-.789 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

3
images/socials/email.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#aaaaaa" class="bi bi-envelope-fill" viewBox="0 0 16 16">
<path d="M.05 3.555A2 2 0 0 1 2 2h12a2 2 0 0 1 1.95 1.555L8 8.414zM0 4.697v7.104l5.803-3.558zM6.761 8.83l-6.57 4.027A2 2 0 0 0 2 14h12a2 2 0 0 0 1.808-1.144l-6.57-4.027L8 9.586zm3.436-.586L16 11.801V4.697z"/>
</svg>

After

Width:  |  Height:  |  Size: 344 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 120 120" width="32" height="32"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path stroke-width="1.306" d="m117.728 54.656-52.39-52.39a7.727 7.727 0 0 0-10.931 0l-10.875 10.88 13.797 13.8a9.18 9.18 0 0 1 11.622 11.702l13.3 13.3a9.18 9.18 0 0 1 9.505 2.183 9.194 9.194 0 0 1 0 13.003 9.205 9.205 0 0 1-13.013 0 9.2 9.2 0 0 1-1.995-10.003L64.343 44.728v32.645c5.642 2.788 6.879 10.294 2.428 14.744a9.19 9.19 0 0 1-13.002 0 9.194 9.194 0 0 1 0-13.005 9.2 9.2 0 0 1 3.009-2.01V44.158a9.206 9.206 0 0 1-4.988-12.06L38.186 18.493 2.26 54.41a7.74 7.74 0 0 0 0 10.931l52.392 52.399a7.736 7.736 0 0 0 10.93 0l52.157-52.152a7.74 7.74 0 0 0 0-10.932"/></clipPath></defs><g clip-path="url(#a)" paint-order="markers stroke fill"><rect width="120" height="22.5" fill="#fe9494" ry="0"/><rect width="120" height="22.5" y="20" fill="#ffc783" ry="0"/><rect width="120" height="22.5" y="40" fill="#fff683" ry="0"/><rect width="120" height="22.5" y="60.001" fill="#69cb86" ry="0"/><rect width="120" height="22.5" y="80.001" fill="#83a8ff" ry="0"/><rect width="120" height="19.999" y="100.002" fill="#c56ad4" ry="0"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#000000" class="bi bi-github" viewBox="0 0 16 16">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
</svg>

After

Width:  |  Height:  |  Size: 703 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#0a66c2" class="bi bi-linkedin" viewBox="0 0 16 16">
<path d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z"/>
</svg>

After

Width:  |  Height:  |  Size: 661 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#563ACC" class="bi bi-mastodon" viewBox="0 0 16 16">
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z"/>
</svg>

After

Width:  |  Height:  |  Size: 947 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FF5700" class="bi bi-reddit" viewBox="0 0 16 16">
<path d="M6.167 8a.83.83 0 0 0-.83.83c0 .459.372.84.83.831a.831.831 0 0 0 0-1.661m1.843 3.647c.315 0 1.403-.038 1.976-.611a.23.23 0 0 0 0-.306.213.213 0 0 0-.306 0c-.353.363-1.126.487-1.67.487-.545 0-1.308-.124-1.671-.487a.213.213 0 0 0-.306 0 .213.213 0 0 0 0 .306c.564.563 1.652.61 1.977.61zm.992-2.807c0 .458.373.83.831.83s.83-.381.83-.83a.831.831 0 0 0-1.66 0z"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-3.828-1.165c-.315 0-.602.124-.812.325-.801-.573-1.9-.945-3.121-.993l.534-2.501 1.738.372a.83.83 0 1 0 .83-.869.83.83 0 0 0-.744.468l-1.938-.41a.2.2 0 0 0-.153.028.2.2 0 0 0-.086.134l-.592 2.788c-1.24.038-2.358.41-3.17.992-.21-.2-.496-.324-.81-.324a1.163 1.163 0 0 0-.478 2.224q-.03.17-.029.353c0 1.795 2.091 3.256 4.669 3.256s4.668-1.451 4.668-3.256c0-.114-.01-.238-.029-.353.401-.181.688-.592.688-1.069 0-.65-.525-1.165-1.165-1.165"/>
</svg>

After

Width:  |  Height:  |  Size: 979 B

3
images/socials/site.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#aaaaaa" class="bi bi-globe2" viewBox="0 0 16 16">
<path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8m7.5-6.923c-.67.204-1.335.82-1.887 1.855q-.215.403-.395.872c.705.157 1.472.257 2.282.287zM4.249 3.539q.214-.577.481-1.078a7 7 0 0 1 .597-.933A7 7 0 0 0 3.051 3.05q.544.277 1.198.49zM3.509 7.5c.036-1.07.188-2.087.436-3.008a9 9 0 0 1-1.565-.667A6.96 6.96 0 0 0 1.018 7.5zm1.4-2.741a12.3 12.3 0 0 0-.4 2.741H7.5V5.091c-.91-.03-1.783-.145-2.591-.332M8.5 5.09V7.5h2.99a12.3 12.3 0 0 0-.399-2.741c-.808.187-1.681.301-2.591.332zM4.51 8.5c.035.987.176 1.914.399 2.741A13.6 13.6 0 0 1 7.5 10.91V8.5zm3.99 0v2.409c.91.03 1.783.145 2.591.332.223-.827.364-1.754.4-2.741zm-3.282 3.696q.18.469.395.872c.552 1.035 1.218 1.65 1.887 1.855V11.91c-.81.03-1.577.13-2.282.287zm.11 2.276a7 7 0 0 1-.598-.933 9 9 0 0 1-.481-1.079 8.4 8.4 0 0 0-1.198.49 7 7 0 0 0 2.276 1.522zm-1.383-2.964A13.4 13.4 0 0 1 3.508 8.5h-2.49a6.96 6.96 0 0 0 1.362 3.675c.47-.258.995-.482 1.565-.667m6.728 2.964a7 7 0 0 0 2.275-1.521 8.4 8.4 0 0 0-1.197-.49 9 9 0 0 1-.481 1.078 7 7 0 0 1-.597.933M8.5 11.909v3.014c.67-.204 1.335-.82 1.887-1.855q.216-.403.395-.872A12.6 12.6 0 0 0 8.5 11.91zm3.555-.401c.57.185 1.095.409 1.565.667A6.96 6.96 0 0 0 14.982 8.5h-2.49a13.4 13.4 0 0 1-.437 3.008M14.982 7.5a6.96 6.96 0 0 0-1.362-3.675c-.47.258-.995.482-1.565.667.248.92.4 1.938.437 3.008zM11.27 2.461q.266.502.482 1.078a8.4 8.4 0 0 0 1.196-.49 7 7 0 0 0-2.275-1.52c.218.283.418.597.597.932m-.488 1.343a8 8 0 0 0-.395-.872C9.835 1.897 9.17 1.282 8.5 1.077V4.09c.81-.03 1.577-.13 2.282-.287z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#1ED760" class="bi bi-spotify" viewBox="0 0 16 16">
<path d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0m3.669 11.538a.5.5 0 0 1-.686.165c-1.879-1.147-4.243-1.407-7.028-.77a.499.499 0 0 1-.222-.973c3.048-.696 5.662-.397 7.77.892a.5.5 0 0 1 .166.686m.979-2.178a.624.624 0 0 1-.858.205c-2.15-1.321-5.428-1.704-7.972-.932a.625.625 0 0 1-.362-1.194c2.905-.881 6.517-.454 8.986 1.063a.624.624 0 0 1 .206.858m.084-2.268C10.154 5.56 5.9 5.419 3.438 6.166a.748.748 0 1 1-.434-1.432c2.825-.857 7.523-.692 10.492 1.07a.747.747 0 1 1-.764 1.288"/>
</svg>

After

Width:  |  Height:  |  Size: 604 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#9146FF" class="bi bi-twitch" viewBox="0 0 16 16">
<path d="M3.857 0 1 2.857v10.286h3.429V16l2.857-2.857H9.57L14.714 8V0zm9.714 7.429-2.285 2.285H9l-2 2v-2H4.429V1.143h9.142z"/>
<path d="M11.857 3.143h-1.143V6.57h1.143zm-3.143 0H7.571V6.57h1.143z"/>
</svg>

After

Width:  |  Height:  |  Size: 329 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#1DA1F2" class="bi bi-twitter" viewBox="0 0 16 16">
<path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334q.002-.211-.006-.422A6.7 6.7 0 0 0 16 3.542a6.7 6.7 0 0 1-1.889.518 3.3 3.3 0 0 0 1.447-1.817 6.5 6.5 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.32 9.32 0 0 1-6.767-3.429 3.29 3.29 0 0 0 1.018 4.382A3.3 3.3 0 0 1 .64 6.575v.045a3.29 3.29 0 0 0 2.632 3.218 3.2 3.2 0 0 1-.865.115 3 3 0 0 1-.614-.057 3.28 3.28 0 0 0 3.067 2.277A6.6 6.6 0 0 1 .78 13.58a6 6 0 0 1-.78-.045A9.34 9.34 0 0 0 5.026 15"/>
</svg>

After

Width:  |  Height:  |  Size: 581 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FF0000" class="bi bi-youtube" viewBox="0 0 16 16">
<path d="M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.01 2.01 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.01 2.01 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31 31 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.01 2.01 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A100 100 0 0 1 7.858 2zM6.4 5.209v4.818l4.157-2.408z"/>
</svg>

After

Width:  |  Height:  |  Size: 888 B

55
images/theme/estrogen.svg Normal file
View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 556.37 303.36" style="enable-background:new 0 0 556.37 303.36;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
</style>
<g>
<polygon points="32.85,271.82 17.96,271.82 17.96,260.06 14.17,260.06 14.17,288.69 17.96,288.69 17.96,275.2 32.85,275.2
32.85,288.69 36.63,288.69 36.63,260.06 32.85,260.06 "/>
<path d="M62.65,261.45c-2.12-1.26-4.51-1.89-7.15-1.89c-4.04,0-7.33,1.34-9.88,4.04c-2.55,2.69-3.83,6.41-3.83,11.16
c0,2.52,0.55,4.9,1.64,7.15c1.09,2.25,2.7,4.03,4.82,5.33c2.12,1.3,4.53,1.95,7.23,1.95c2.49,0,4.8-0.59,6.95-1.77
c2.15-1.18,3.81-2.91,4.98-5.21c1.17-2.29,1.76-4.89,1.76-7.79c0-2.86-0.56-5.43-1.67-7.68C66.39,264.47,64.77,262.71,62.65,261.45
z M62.5,282.93c-1.84,2.01-4.19,3.01-7.04,3.01c-2.8,0-5.13-0.99-6.98-2.98c-1.86-1.99-2.78-4.7-2.78-8.16
c0-4.31,0.97-7.39,2.9-9.23c1.93-1.84,4.24-2.77,6.92-2.77c1.89,0,3.59,0.48,5.11,1.44s2.67,2.3,3.46,4.04
c0.79,1.74,1.18,3.77,1.18,6.1C65.27,278.08,64.35,280.93,62.5,282.93z"/>
<polygon points="262.41,214.22 247.52,214.22 247.52,202.46 243.73,202.46 243.73,231.1 247.52,231.1 247.52,217.6 262.41,217.6
262.41,231.1 266.2,231.1 266.2,202.46 262.41,202.46 "/>
<polygon points="312.29,127.82 297.4,127.82 297.4,116.06 293.62,116.06 293.62,144.7 297.4,144.7 297.4,131.2 312.29,131.2
312.29,144.7 316.08,144.7 316.08,116.06 312.29,116.06 "/>
<rect x="173.77" y="159.62" transform="matrix(0.4998 -0.8661 0.8661 0.4998 -70.4902 242.7992)" width="2.4" height="45.62"/>
<rect x="114.5" y="193.83" width="2.4" height="45.64"/>
<rect x="152.16" y="249.67" transform="matrix(0.8662 -0.4997 0.4997 0.8662 -101.9474 120.9965)" width="45.62" height="2.4"/>
<polygon points="260.54,193.57 249.4,193.57 248.97,195.97 260.97,195.97 "/>
<polygon points="258.36,181.33 251.59,181.33 251.16,183.73 258.79,183.73 "/>
<polygon points="256.17,169.09 253.77,169.09 253.35,171.49 256.6,171.49 "/>
<path d="M420.15,41.85c2.12,1.3,4.53,1.95,7.23,1.95c2.49,0,4.8-0.59,6.95-1.77s3.81-2.91,4.98-5.21s1.76-4.89,1.76-7.79
c0-2.87-0.56-5.43-1.67-7.69s-2.73-4.02-4.85-5.28c-2.12-1.26-4.51-1.89-7.15-1.89c-4.04,0-7.33,1.34-9.88,4.03
c-2.55,2.69-3.83,6.41-3.83,11.16c0,2.51,0.55,4.9,1.64,7.15S418.03,40.55,420.15,41.85z M420.5,20.2
c1.93-1.84,4.24-2.76,6.92-2.76c1.89,0,3.59,0.48,5.11,1.44s2.67,2.3,3.46,4.04s1.18,3.77,1.18,6.1c0,3.69-0.92,6.53-2.77,8.54
s-4.19,3.01-7.04,3.01c-2.8,0-5.13-0.99-6.98-2.98s-2.78-4.7-2.78-8.15C417.6,25.12,418.56,22.04,420.5,20.2z"/>
<polygon points="464.75,26.44 449.87,26.44 449.87,14.68 446.08,14.68 446.08,43.31 449.87,43.31 449.87,29.82 464.75,29.82
464.75,43.31 468.54,43.31 468.54,14.68 464.75,14.68 "/>
<path d="M426.42,51.04l-11.41-3.71l-6.53,35.4l-52.4,17.03l4.66-55.9h-12l4.62,55.42l-48.5-28l-51.08,29.49v57.59l-48.68,28.12
l-49.88-28.8l-51.08,29.48v57.6l-31.34,18.1l1.2,2.06l31.35-18.08l49.88,28.8l49.88-28.8l49.88,28.8l51.08-29.48v-57.6l48.82-28.2
l55.1,17.92l34.88-48.02L410.9,83.51L426.42,51.04z M155.21,272.87l-48.68-28.12v-56.2l48.68-28.12l48.68,28.12v56.2L155.21,272.87
z M254.97,272.87l-48.68-28.12v-56.2l48.68-28.12l48.68,28.12v56.2L254.97,272.87z M306.35,185.61l4.51-34.64h-12l4.51,34.64
l-47.19-27.26v-56.21l48.68-28.11l48.68,28.11v56.21L306.35,185.61z M441.89,130.25l-32.83,45.18l-53.12-17.26v-55.85l53.12-17.26
L441.89,130.25z"/>
<polygon points="362.17,214.22 347.28,214.22 347.28,202.46 343.49,202.46 343.49,231.1 347.28,231.1 347.28,217.6 362.17,217.6
362.17,231.1 365.96,231.1 365.96,202.46 362.17,202.46 "/>
<polygon points="348.73,195.97 360.73,195.97 360.31,193.57 349.16,193.57 "/>
<polygon points="350.92,183.73 358.55,183.73 358.12,181.33 351.35,181.33 "/>
<polygon points="353.53,169.09 353.11,171.49 356.36,171.49 355.93,169.09 "/>
<path d="M508.21,117.45c-2.12-1.26-4.51-1.89-7.15-1.89c-4.04,0-7.33,1.34-9.88,4.03c-2.55,2.69-3.83,6.41-3.83,11.16
c0,2.51,0.55,4.9,1.64,7.15s2.7,4.03,4.82,5.33c2.12,1.3,4.53,1.95,7.23,1.95c2.49,0,4.8-0.59,6.95-1.77s3.81-2.91,4.98-5.21
c1.17-2.29,1.76-4.89,1.76-7.79c0-2.87-0.56-5.43-1.67-7.69C511.95,120.47,510.33,118.71,508.21,117.45z M508.06,138.93
c-1.84,2.01-4.19,3.01-7.04,3.01c-2.8,0-5.13-0.99-6.98-2.98s-2.78-4.7-2.78-8.15c0-4.31,0.96-7.39,2.9-9.23s4.24-2.76,6.92-2.76
c1.89,0,3.59,0.48,5.11,1.44s2.67,2.3,3.46,4.04s1.18,3.77,1.18,6.1C510.83,134.08,509.9,136.93,508.06,138.93z"/>
<polygon points="538.4,116.06 538.4,127.82 523.52,127.82 523.52,116.06 519.73,116.06 519.73,144.7 523.52,144.7 523.52,131.2
538.4,131.2 538.4,144.7 542.19,144.7 542.19,116.06 "/>
<polygon points="478.41,135.83 480.81,136.25 480.81,124.25 478.41,124.67 "/>
<polygon points="465.9,133.63 468.3,134.05 468.3,126.45 465.9,126.85 "/>
<polygon points="453.38,131.45 455.78,131.87 455.78,128.63 453.38,129.05 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
images/theme/frappe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
images/theme/latte.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
images/theme/macchiato.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
images/theme/mocha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

62
js/flavors.js Normal file
View File

@ -0,0 +1,62 @@
(function flavors() {
// Metadata only — colors are defined in the per-flavor CSS files.
const FLAVORS = {
mocha: { label: "Mocha", dot: "#f5c2e7" },
macchiato: { label: "Macchiato", dot: "#f5bde6" },
frappe: { label: "Frappé", dot: "#f4b8e4" },
latte: { label: "Latte", dot: "#ea76cb" },
};
const ORDER = ["mocha", "macchiato", "frappe", "latte"];
const root = document.documentElement;
const ls = window.localStorage;
function apply(name) {
const f = FLAVORS[name] || FLAVORS.mocha;
root.setAttribute("data-flavor", name); // CSS does the rest
const meta = document.querySelector('meta[name="theme-color"]');
if (meta) meta.setAttribute("content", f.dot);
}
let current = ls.getItem("ctpFlavor");
if (!ORDER.includes(current)) current = "mocha";
apply(current); // the <head> snippet already set this to avoid a flash
// ---- top-right corner icon button ----
const bar = document.createElement("div");
bar.className = "beta-bar";
bar.innerHTML = `
<button class="beta-btn" id="flavor-btn" type="button">
<img class="beta-icon" alt="">
</button>`;
// Group the single-item widgets (now-playing + theme toggle) into one
// top bar. On mobile they sit side by side; on desktop both stay
// position:fixed, so this wrapper is zero-size and invisible.
let topbar = document.querySelector(".topbar");
if (!topbar) {
topbar = document.createElement("div");
topbar.className = "topbar";
document.body.insertBefore(topbar, document.body.firstChild);
const np = document.getElementById("now-playing");
if (np) topbar.appendChild(np);
}
topbar.appendChild(bar);
const btn = bar.querySelector("#flavor-btn");
const icon = bar.querySelector(".beta-icon");
function paintBtn() {
const f = FLAVORS[current];
icon.src = `/images/theme/${current}.png`; // e.g. /images/theme/mocha.png
icon.alt = f.label;
btn.title = `Theme: ${f.label} (click to cycle)`;
}
paintBtn();
btn.addEventListener("click", () => {
current = ORDER[(ORDER.indexOf(current) + 1) % ORDER.length];
ls.setItem("ctpFlavor", current);
apply(current);
paintBtn();
});
})();

169
js/site-switcher.js Normal file
View File

@ -0,0 +1,169 @@
/* Cross-site switcher a single dropdown that links the sister sites:
* clove.is-a.dev · doughmination.is-a.dev · lumine.is-a.dev
*
* Self-contained: injects its own CSS + markup and slots itself into the
* existing bottom-left page nav (.nav-links). Drop one script tag on any
* page that has the nav and it just works. The current site is detected
* from the hostname and marked, and the redundant single "is-a-dev" pill
* (if present) is removed so we don't double up on cross-site links.
*/
(function siteSwitcher() {
var SITES = [
{ id: "clove", label: "clove.is-a.dev", url: "https://clove.is-a.dev", note: "Link Center" },
{ id: "doughmination", label: "doughmination.is-a.dev", url: "https://doughmination.is-a.dev", note: "Beta Link Center" },
{ id: "lumine", label: "lumine.is-a.dev", url: "https://lumine.is-a.dev", note: "Discord Bots" },
];
var host = (location.hostname || "").replace(/^www\./, "");
var currentId = null;
for (var i = 0; i < SITES.length; i++) {
if (host === SITES[i].url.replace("https://", "")) currentId = SITES[i].id;
}
// ---- styles -------------------------------------------------------------
var css = `
.site-switcher { position: relative; }
.site-switcher-btn {
position: relative;
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.3rem 0.7rem;
border-radius: 999px;
background: var(--surface-1);
border: 1px solid var(--surface-2);
color: var(--text);
font: inherit;
font-size: 0.8rem;
cursor: pointer;
transition: transform 0.15s ease, border-color 0.15s ease, background 0.15s ease;
}
.site-switcher-btn:hover {
border-color: rgb(var(--accent-rgb));
transform: translateX(2px);
}
.site-switcher-dot {
width: 8px; height: 8px; border-radius: 50%;
background: rgb(var(--accent-rgb)); flex-shrink: 0;
}
.site-switcher-caret {
font-size: 0.7rem; line-height: 1; opacity: 0.8;
transition: transform 0.15s ease;
}
.site-switcher.open .site-switcher-caret { transform: rotate(180deg); }
.site-switcher-menu {
position: absolute;
left: 0;
bottom: calc(100% + 0.45rem);
display: flex;
flex-direction: column;
gap: 0.25rem;
min-width: 210px;
padding: 0.4rem;
border-radius: 12px;
background: var(--surface-0);
border: 1px solid var(--surface-1);
box-shadow: 0 10px 28px -8px rgba(17, 17, 27, 0.7);
opacity: 0;
transform: translateY(6px);
pointer-events: none;
transition: opacity 0.15s ease, transform 0.15s ease;
z-index: 30;
}
.site-switcher.open .site-switcher-menu {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
.site-switcher-item {
display: flex;
flex-direction: column;
gap: 0.05rem;
padding: 0.4rem 0.6rem;
border-radius: 8px;
text-decoration: none;
color: var(--text);
border: 1px solid transparent;
transition: background 0.12s ease, border-color 0.12s ease;
}
.site-switcher-item:hover { background: var(--surface-1); }
.site-switcher-item .ss-label { font-size: 0.82rem; font-weight: 500; }
.site-switcher-item .ss-note { font-size: 0.68rem; color: var(--subtext-0); }
.site-switcher-item.current {
border-color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.12);
}
.site-switcher-item.current .ss-label { color: rgb(var(--accent-rgb)); }
@media (max-width: 640px) {
.site-switcher-menu { left: 50%; transform: translate(-50%, 6px); }
.site-switcher.open .site-switcher-menu { transform: translate(-50%, 0); }
}`;
var style = document.createElement("style");
style.textContent = css;
document.head.appendChild(style);
// ---- markup -------------------------------------------------------------
var current = SITES.filter(function (s) { return s.id === currentId; })[0];
var btnLabel = current ? current.label : "Sites";
var wrap = document.createElement("div");
wrap.className = "site-switcher";
var menuItems = SITES.map(function (s) {
var isCur = s.id === currentId;
return (
'<a class="site-switcher-item' + (isCur ? " current" : "") + '"' +
' role="menuitem"' + (isCur ? ' aria-current="page"' : "") +
' href="' + s.url + '">' +
'<span class="ss-label">' + s.label + "</span>" +
'<span class="ss-note">' + s.note + (isCur ? " · you are here" : "") + "</span>" +
"</a>"
);
}).join("");
wrap.innerHTML =
'<button class="site-switcher-btn" type="button" aria-haspopup="true" aria-expanded="false">' +
'<span class="site-switcher-dot" aria-hidden="true"></span>' +
"<span>" + btnLabel + "</span>" +
'<span class="site-switcher-caret" aria-hidden="true">▾</span>' +
"</button>" +
'<div class="site-switcher-menu" role="menu">' + menuItems + "</div>";
// ---- mount: into the existing nav, else float bottom-left ---------------
var navLinks = document.querySelector(".nav-links");
if (navLinks) {
var stale = navLinks.querySelector(".nav-link.is-a-dev");
if (stale) stale.remove();
navLinks.appendChild(wrap);
} else {
wrap.style.position = "fixed";
wrap.style.left = "1rem";
wrap.style.bottom = "1rem";
wrap.style.zIndex = "6";
document.body.appendChild(wrap);
}
// ---- behaviour ----------------------------------------------------------
var btn = wrap.querySelector(".site-switcher-btn");
function setOpen(open) {
wrap.classList.toggle("open", open);
btn.setAttribute("aria-expanded", open ? "true" : "false");
}
btn.addEventListener("click", function (e) {
e.stopPropagation();
setOpen(!wrap.classList.contains("open"));
});
document.addEventListener("click", function (e) {
if (!wrap.contains(e.target)) setOpen(false);
});
document.addEventListener("keydown", function (e) {
if (e.key === "Escape") setOpen(false);
});
})();