diff --git a/assets/app.js b/assets/app.js
index 646f20d..bcbdacd 100644
--- a/assets/app.js
+++ b/assets/app.js
@@ -3,6 +3,13 @@ var ICONS = {
system: '',
light: '',
dark: '',
+ midnight: '',
+ nord: '',
+ dracula: '',
+ forest: '',
+ sunset: '',
+ cyberpunk: '',
+ halloween: '',
search: '',
menu: '',
doc: '',
@@ -14,6 +21,33 @@ var ICONS = {
chevronRight: ''
};
+var THEMES_GENERAL = [
+ { id: "dark", label: "Dark" },
+ { id: "light", label: "Light" },
+ { id: "midnight", label: "Midnight" },
+ { id: "nord", label: "Nord" },
+ { id: "dracula", label: "Dracula" },
+ { id: "forest", label: "Forest" },
+ { id: "sunset", label: "Sunset" },
+ { id: "cyberpunk", label: "Cyberpunk" }
+];
+
+var THEMES_SEASONAL = [
+ { id: "halloween", label: "Halloween" }
+];
+
+var THEME_VIDEOS = {
+ halloween: "https://www.pexels.com/download/video/5605039/",
+ dark: "https://www.pexels.com/download/video/31270356/",
+ light: "https://www.pexels.com/download/video/13956986/",
+ midnight: "https://www.pexels.com/download/video/15860507/",
+ nord: "https://www.pexels.com/download/video/31468607/",
+ dracula: "https://www.pexels.com/download/video/8116002/",
+ forest: "https://www.pexels.com/download/video/11265968/",
+ sunset: "https://www.pexels.com/download/video/855437/",
+ cyberpunk: "https://www.pexels.com/download/video/32336464/"
+};
+
var SITE_TREE = [
{
id: "vyla",
@@ -116,25 +150,32 @@ function esc(s) {
}
function getThemeMode() {
- var v = localStorage.getItem(THEME_KEY);
- return v === "light" || v === "dark" ? v : "system";
+ return localStorage.getItem(THEME_KEY) || "halloween";
}
function applyTheme() {
var mode = getThemeMode();
- var dark = mode === "dark" || (mode === "system" && window.matchMedia("(prefers-color-scheme: dark)").matches);
- document.documentElement.classList.toggle("dark", dark);
+ document.documentElement.setAttribute("data-theme", mode);
var logo = document.getElementById("brand-logo");
- if (logo) logo.src = dark ? "/assets/images/logo.png" : "/assets/images/dark_logo.png";
+ if (logo) logo.src = mode === "light" ? "/assets/images/dark_logo.png" : "/assets/images/logo.png";
+ var targetSrc = THEME_VIDEOS[mode] || THEME_VIDEOS.halloween;
+ document.querySelectorAll(".body-blurred-video, .header-video").forEach(function (v) {
+ if (v.getAttribute("src") !== targetSrc) {
+ v.src = targetSrc;
+ v.load();
+ v.play().catch(function () { });
+ }
+ });
}
function setTheme(mode) {
- if (mode === "system") localStorage.removeItem(THEME_KEY);
- else localStorage.setItem(THEME_KEY, mode);
+ localStorage.setItem(THEME_KEY, mode);
applyTheme();
refreshThemeUI();
var menu = document.getElementById("theme-menu");
if (menu) menu.classList.remove("open");
+ var segMenu = document.getElementById("theme-seg-menu");
+ if (segMenu) segMenu.classList.remove("open");
}
function toggleThemeMenu(e) {
@@ -146,10 +187,16 @@ function toggleThemeMenu(e) {
function refreshThemeUI() {
var mode = getThemeMode();
var btn = document.getElementById("theme-toggle");
- if (btn) btn.innerHTML = icon(mode);
- document.querySelectorAll("#theme-menu button, #theme-seg button").forEach(function (b) {
+ if (btn) btn.innerHTML = icon(ICONS[mode] ? mode : "dark");
+ document.querySelectorAll("#theme-menu button, #theme-seg button[data-mode], #theme-seg-menu button").forEach(function (b) {
b.classList.toggle("on", b.getAttribute("data-mode") === mode);
});
+ var moreBtn = document.getElementById("theme-seg-more");
+ if (moreBtn) {
+ var isOther = mode !== "dark" && mode !== "light";
+ moreBtn.classList.toggle("on", isOther);
+ moreBtn.innerHTML = icon(ICONS[mode] ? mode : "halloween");
+ }
}
function buildThemeControls() {
@@ -160,12 +207,18 @@ function buildThemeControls() {
wrap.className = "theme-wrap";
btn.parentNode.insertBefore(wrap, btn);
wrap.appendChild(btn);
- var modes = ["system", "light", "dark"];
var menu = document.createElement("div");
menu.id = "theme-menu";
- menu.innerHTML = modes.map(function (m) {
- return '';
- }).join("");
+ var html = '
';
+ THEMES_GENERAL.forEach(function (t) {
+ html += '';
+ });
+ html += '';
+ html += '';
+ THEMES_SEASONAL.forEach(function (t) {
+ html += '';
+ });
+ menu.innerHTML = html;
wrap.appendChild(menu);
menu.addEventListener("click", function (e) {
var b = e.target.closest("button");
@@ -586,16 +639,35 @@ function buildMobileBar(currentTab, currentItem) {
var sideLinks = document.createElement("div");
sideLinks.className = "side-links";
- var modes = ["system", "light", "dark"];
var seg = document.createElement("div");
seg.id = "theme-seg";
- seg.innerHTML = modes.map(function (m) {
- return '';
- }).join("");
+ var segHtml = '' +
+ '' +
+ '' +
+ '';
+ seg.innerHTML = segHtml;
seg.addEventListener("click", function (e) {
- var btn = e.target.closest("button");
- if (btn) setTheme(btn.getAttribute("data-mode"));
+ var moreBtn = e.target.closest("#theme-seg-more");
+ var segMenu = document.getElementById("theme-seg-menu");
+ if (moreBtn && segMenu) {
+ segMenu.classList.toggle("open");
+ return;
+ }
+ var btn = e.target.closest("button[data-mode]");
+ if (btn) {
+ setTheme(btn.getAttribute("data-mode"));
+ if (segMenu) segMenu.classList.remove("open");
+ }
});
sideLinks.appendChild(seg);
@@ -812,6 +884,7 @@ function loadPage() {
})
.then(function (html) {
contentEl.innerHTML = html;
+ applyTheme();
window.scrollTo(0, 0);
})
.catch(function () {
@@ -1152,7 +1225,9 @@ document.addEventListener("DOMContentLoaded", function () {
var sidebar = document.getElementById("sidebar");
var menu = document.getElementById("theme-menu");
+ var segMenu = document.getElementById("theme-seg-menu");
if (menu && !e.target.closest(".theme-wrap")) menu.classList.remove("open");
+ if (segMenu && !e.target.closest("#theme-seg")) segMenu.classList.remove("open");
if (
sidebar &&
sidebar.classList.contains("open") &&
diff --git a/assets/images/themes/halloween/cobweb.png b/assets/images/themes/halloween/cobweb.png
new file mode 100644
index 0000000..403f6fb
Binary files /dev/null and b/assets/images/themes/halloween/cobweb.png differ
diff --git a/assets/styling/404.css b/assets/styling/404.css
index c938933..2e614f2 100644
--- a/assets/styling/404.css
+++ b/assets/styling/404.css
@@ -33,7 +33,7 @@ body.is-404 .error-container {
body.is-404 .error-code {
margin: 0 0 16px;
- color: var(--color-text-primary);
+ color: var(--text-heading);
font-size: clamp(74px, 14vw, 112px);
font-weight: 700;
line-height: 1;
@@ -42,7 +42,7 @@ body.is-404 .error-code {
body.is-404 .error-title {
margin: 0 0 24px;
- color: var(--color-text-primary);
+ color: var(--text-heading);
font-size: 18px;
font-weight: 800;
letter-spacing: 0.12em;
@@ -52,30 +52,21 @@ body.is-404 .error-title {
body.is-404 .error-desc {
max-width: 440px;
margin: 0 0 32px;
- color: var(--muted-light);
+ color: var(--muted);
font-size: 15.5px;
line-height: 1.6;
}
-html.dark body.is-404 .error-desc {
- color: var(--muted-dark);
-}
-
body.is-404 .btn-home {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 10px 28px;
border-radius: 9999px;
- background: var(--bg-dark);
- color: var(--bg-light) !important;
+ background: var(--btn-home-bg);
+ color: var(--btn-home-text) !important;
font-size: 14.5px;
font-weight: 500;
text-decoration: none !important;
transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
-}
-
-html.dark body.is-404 .btn-home {
- background: var(--bg-light);
- color: var(--bg-dark) !important;
}
\ No newline at end of file
diff --git a/assets/styling/components.css b/assets/styling/components.css
index 30101af..2abffd7 100644
--- a/assets/styling/components.css
+++ b/assets/styling/components.css
@@ -11,22 +11,18 @@
display: flex;
align-items: center;
gap: 10px;
- background: rgba(0, 0, 0, 0.05);
+ background: var(--search-bg);
width: min(440px, 40vw);
height: 36px;
padding: 0 12px;
border: none;
border-radius: 100px;
- color: var(--muted-light);
+ color: var(--muted);
font: inherit;
font-size: 14px;
cursor: pointer;
}
-html.dark #search-trigger {
- background: rgba(50, 50, 50, 0.1);
-}
-
#search-trigger kbd {
margin-left: auto;
font: 600 11px var(--font);
@@ -50,16 +46,13 @@ html.dark #search-trigger {
margin: 52px auto 0;
border-radius: 20px;
overflow: hidden;
- background: rgb(210, 210, 210, 0.1) !important;
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+ background: var(--search-panel-bg) !important;
+ border: 1px solid var(--border);
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
-html.dark .search-panel {
- background: rgb(10, 10, 10, 0.2) !important;
-}
-
.search-input-row {
display: flex;
align-items: center;
@@ -70,7 +63,7 @@ html.dark .search-panel {
.search-input-row .ico {
width: 18px;
height: 18px;
- color: var(--muted-light);
+ color: var(--muted);
}
#search-input {
@@ -78,7 +71,7 @@ html.dark .search-panel {
border: none;
outline: none;
background: transparent;
- color: inherit;
+ color: var(--text-heading);
font: inherit;
font-size: 18px;
}
@@ -92,11 +85,7 @@ html.dark .search-panel {
.search-label {
padding: 8px 14px;
font-size: 12px;
- color: var(--muted-light);
-}
-
-html.dark .search-label {
- color: var(--muted-dark);
+ color: var(--muted);
}
.sr {
@@ -109,10 +98,11 @@ html.dark .search-label {
.sr>.ico {
margin-top: 3px;
+ color: var(--muted);
}
.sr.on {
- background: rgba(0, 0, 0, 0.06);
+ background: var(--hover-bg);
}
.sr-body {
@@ -123,6 +113,7 @@ html.dark .search-label {
font-size: 14px;
font-weight: 600;
line-height: 1.35;
+ color: var(--text-heading);
}
.sr .s {
@@ -130,7 +121,7 @@ html.dark .search-label {
margin-top: 2px;
font-size: 12.5px;
line-height: 1.4;
- color: var(--muted-light);
+ color: var(--muted);
overflow: hidden;
-webkit-line-clamp: 2;
line-clamp: 2;
@@ -141,17 +132,12 @@ html.dark .search-label {
margin-top: 2px;
font-size: 12px;
line-height: 1.35;
- color: var(--muted-light);
+ color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
-html.dark .sr .s,
-html.dark .sr .p {
- color: var(--muted-dark);
-}
-
.sr .sep {
margin: 0 6px;
opacity: 0.7;
@@ -159,11 +145,7 @@ html.dark .sr .p {
.sr .hit {
font-weight: 700;
- color: var(--text-light);
-}
-
-html.dark .sr .hit {
- color: var(--text-dark);
+ color: var(--text-heading);
}
.search-footer {
@@ -171,11 +153,8 @@ html.dark .sr .hit {
gap: 18px;
padding: 12px 20px;
font-size: 12px;
- color: var(--muted-light);
-}
-
-html.dark .search-footer {
- color: var(--muted-dark);
+ color: var(--muted);
+ border-top: 1px solid var(--border-subtle);
}
.search-footer .close-hint {
@@ -202,34 +181,22 @@ html.dark .search-footer {
border: none;
border-radius: 8px;
background: none;
- color: var(--muted-light);
+ color: var(--muted);
cursor: pointer;
}
.code-wrap .copy-btn:hover {
- background: rgba(0, 0, 0, 0.06);
-}
-
-html.dark .code-wrap .copy-btn {
- color: var(--muted-dark);
-}
-
-html.dark .code-wrap .copy-btn:hover {
- background: rgba(255, 255, 255, 0.1);
+ background: var(--hover-bg);
}
.code-group {
position: relative;
margin: 16px 0;
border-radius: 20px;
- background: #f4f4f5;
+ background: var(--code-group-bg);
padding: 6px 4px 4px;
}
-html.dark .code-group {
- background: #0d0d0d;
-}
-
.code-group-tabs {
display: flex;
align-items: center;
@@ -247,15 +214,11 @@ html.dark .code-group {
border: none;
background: none;
cursor: pointer;
- color: #71717a;
+ color: var(--muted);
}
.code-group-tab.active {
- color: var(--text-light);
-}
-
-html.dark .code-group-tab.active {
- color: #ffffff;
+ color: var(--code-tab-active);
}
.code-group-tab.active::after {
@@ -265,25 +228,16 @@ html.dark .code-group-tab.active {
right: 0;
bottom: 0;
height: 2px;
- background: var(--text-light);
+ background: var(--code-tab-active);
border-radius: 2px;
}
-html.dark .code-group-tab.active::after {
- background: #ffffff;
-}
-
.code-group-panels {
- background: #ffffff;
+ background: var(--code-group-panel-bg);
border-radius: 14px;
overflow: hidden;
}
-html.dark .code-group-panels {
- background: #000000;
- border-color: rgba(255, 255, 255, 0.06);
-}
-
.cg-copy-btn {
position: absolute;
top: 10px;
@@ -295,16 +249,12 @@ html.dark .code-group-panels {
border: none;
border-radius: 6px;
background: none;
- color: #71717a;
+ color: var(--muted);
cursor: pointer;
}
.cg-copy-btn:hover {
- color: var(--text-light);
-}
-
-html.dark .cg-copy-btn:hover {
- color: #ffffff;
+ color: var(--text-heading);
}
.code-group-panel {
@@ -321,7 +271,7 @@ main.prose .code-group pre {
border: none;
border-radius: 0;
background: transparent;
- color: #e6edf3;
+ color: inherit;
}
main.prose .code-group pre code {
@@ -331,13 +281,8 @@ main.prose .code-group pre code {
main.prose blockquote {
margin: 16px 0;
padding: 4px 0 4px 16px;
- border-left: 3px solid var(--border-light);
- color: var(--muted-light);
-}
-
-html.dark main.prose blockquote {
- border-left-color: var(--border-dark);
- color: var(--muted-dark);
+ border-left: 3px solid var(--border);
+ color: var(--muted);
}
main.prose blockquote p {
@@ -351,18 +296,12 @@ main.prose blockquote p {
.skeleton-line,
.skeleton-media {
- background: linear-gradient(90deg, rgba(0, 0, 0, 0.05) 25%, rgba(0, 0, 0, 0.12) 37%, rgba(0, 0, 0, 0.05) 63%);
+ background: linear-gradient(90deg, var(--skeleton-pulse-1) 25%, var(--skeleton-pulse-2) 37%, var(--skeleton-pulse-1) 63%);
background-size: 400% 100%;
animation: skeletonPulse 1.3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
border-radius: 8px;
}
-html.dark .skeleton-line,
-html.dark .skeleton-media {
- background: linear-gradient(90deg, rgba(255, 255, 255, 0.05) 25%, rgba(255, 255, 255, 0.12) 37%, rgba(255, 255, 255, 0.05) 63%);
- background-size: 400% 100%;
-}
-
@keyframes skeletonPulse {
0% {
background-position: 100% 50%;
@@ -513,10 +452,6 @@ html.dark .skeleton-media {
height: 1.3rem;
}
- html.dark #search-trigger {
- background: transparent;
- }
-
#search-trigger span,
#search-trigger kbd {
display: none;
diff --git a/assets/styling/highlight.css b/assets/styling/highlight.css
index 002416b..fcfc269 100644
--- a/assets/styling/highlight.css
+++ b/assets/styling/highlight.css
@@ -1,140 +1,72 @@
-html.dark pre[class*="language-"],
-html.dark code[class*="language-"] {
- color: #abb2bf;
+pre[class*="language-"],
+code[class*="language-"] {
+ color: var(--code-text);
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
- color: #6a737d;
- font-style: italic;
-}
-
-html.dark .token.comment,
-html.dark .token.prolog,
-html.dark .token.doctype,
-html.dark .token.cdata {
- color: #5c6370;
+ color: var(--hl-comment);
font-style: italic;
}
.token.punctuation {
- color: #24292e;
-}
-
-html.dark .token.punctuation {
- color: #abb2bf;
+ color: var(--hl-punct);
}
.token.function,
.token.function-name {
- color: #6f42c1;
- font-weight: 500;
-}
-
-html.dark .token.function,
-html.dark .token.function-name {
- color: #61afef;
+ color: var(--hl-func);
font-weight: 500;
}
.token.keyword,
.token.selector {
- color: #d73a49;
- font-weight: 600;
-}
-
-html.dark .token.keyword,
-html.dark .token.selector {
- color: #c678dd;
+ color: var(--hl-keyword);
font-weight: 600;
}
.token.string,
.token.url {
- color: #22863a;
-}
-
-html.dark .token.string,
-html.dark .token.url {
- color: #98c379;
+ color: var(--hl-string);
}
.token.variable,
.token.attr-name,
.token.property {
- color: #e36209;
-}
-
-html.dark .token.variable,
-html.dark .token.attr-name,
-html.dark .token.property {
- color: #e06c75;
+ color: var(--hl-var);
}
.token.operator,
.token.entity {
- color: #d73a49;
-}
-
-html.dark .token.operator,
-html.dark .token.entity {
- color: #56b6c2;
+ color: var(--hl-op);
}
.token.number,
.token.boolean,
.token.constant {
- color: #005cc5;
-}
-
-html.dark .token.number,
-html.dark .token.boolean,
-html.dark .token.constant {
- color: #d19a66;
+ color: var(--hl-num);
}
.token.parameter {
- color: #b08800;
-}
-
-html.dark .token.parameter {
- color: #d19a66;
+ color: var(--hl-param);
}
.token.class-name {
- color: #6f42c1;
-}
-
-html.dark .token.class-name {
- color: #e5c07b;
+ color: var(--hl-class);
}
.token.tag {
- color: #22863a;
-}
-
-html.dark .token.tag {
- color: #e06c75;
+ color: var(--hl-tag);
}
.token.deleted {
- color: #b31d28;
- background-color: #ffeef0;
-}
-
-html.dark .token.deleted {
- color: #e06c75;
- background-color: rgba(224, 108, 117, 0.15);
+ color: var(--hl-deleted-color);
+ background-color: var(--hl-deleted-bg);
}
.token.inserted {
- color: #22863a;
- background-color: #f0fff4;
-}
-
-html.dark .token.inserted {
- color: #98c379;
- background-color: rgba(152, 195, 121, 0.15);
+ color: var(--hl-inserted-color);
+ background-color: var(--hl-inserted-bg);
}
\ No newline at end of file
diff --git a/assets/styling/layout.css b/assets/styling/layout.css
index 8c335bf..556a2c3 100644
--- a/assets/styling/layout.css
+++ b/assets/styling/layout.css
@@ -43,11 +43,7 @@
#banner-close:hover {
opacity: 1;
- background: rgba(0, 0, 0, 0.06);
-}
-
-html.dark #banner-close:hover {
- background: rgba(255, 255, 255, 0.1);
+ background: var(--hover-bg);
}
#navbar {
@@ -98,31 +94,19 @@ html.dark #banner-close:hover {
padding: 6px 14px;
font-size: 14px;
font-weight: 500;
- color: var(--muted-light);
+ color: var(--muted);
white-space: nowrap;
}
-html.dark #navbar .tabs a {
- color: var(--muted-dark);
-}
-
#navbar .tabs a:hover {
- color: var(--text-light);
-}
-
-html.dark #navbar .tabs a:hover {
- color: var(--text-dark);
+ color: var(--text-heading);
}
#navbar .tabs a.active {
- color: var(--text-light);
+ color: var(--text-heading);
font-weight: 600;
}
-html.dark #navbar .tabs a.active {
- color: var(--text-dark);
-}
-
#layout {
display: flex;
max-width: 1400px;
@@ -151,14 +135,10 @@ html.dark #navbar .tabs a.active {
font-size: 14px;
font-weight: 600;
line-height: 23px;
- color: var(--text-light);
+ color: var(--text);
margin: 0 0 10px 16px;
}
-html.dark #sidebar .group-title {
- color: var(--text-dark);
-}
-
#sidebar ul {
list-style: none;
margin: 0;
@@ -171,29 +151,16 @@ html.dark #sidebar .group-title {
border-radius: 12px;
font-size: 14px;
line-height: 21px;
- color: var(--muted-light);
-}
-
-html.dark #sidebar li a {
- color: var(--muted-dark);
+ color: var(--muted);
}
#sidebar li a.active {
- color: var(--text-light);
-}
-
-html.dark #sidebar li a.active {
- color: var(--text-dark);
+ color: var(--text-heading);
}
#sidebar li a:hover {
- background: rgba(0, 0, 0, 0.05);
- color: var(--text-light);
-}
-
-html.dark #sidebar li a:hover {
- background: rgba(255, 255, 255, 0.08);
- color: var(--text-dark);
+ background: var(--hover-bg);
+ color: var(--text-heading);
}
#content-col {
@@ -246,14 +213,10 @@ footer#site-footer {
gap: 8px;
font-size: 14px;
font-weight: 600;
- color: var(--text-light);
+ color: var(--text-heading);
transition: opacity 0.15s ease;
}
-html.dark .footer-link {
- color: #ffffff;
-}
-
.footer-link:hover {
opacity: 0.8;
}
@@ -268,14 +231,10 @@ html.dark .footer-link {
.footer-bottom {
width: 100%;
- border-top: 1px solid rgba(0, 0, 0, 0.08);
+ border-top: 1px solid var(--footer-border);
padding-top: 28px;
}
-html.dark .footer-bottom {
- border-top: 1px solid rgba(255, 255, 255, 0.08);
-}
-
.footer-socials {
display: flex;
gap: 16px;
@@ -284,20 +243,12 @@ html.dark .footer-bottom {
.footer-socials a {
display: flex;
align-items: center;
- color: var(--muted-light);
+ color: var(--muted);
transition: color 0.15s ease;
}
-html.dark .footer-socials a {
- color: var(--muted-dark);
-}
-
.footer-socials a:hover {
- color: var(--text-light);
-}
-
-html.dark .footer-socials a:hover {
- color: #ffffff;
+ color: var(--text-heading);
}
.footer-icon {
@@ -318,7 +269,7 @@ html.dark .footer-socials a:hover {
border: none;
border-radius: 10px;
background: none;
- color: var(--muted-light);
+ color: var(--muted);
cursor: pointer;
}
@@ -328,37 +279,49 @@ html.dark .footer-socials a:hover {
}
#theme-toggle:hover {
- background: rgba(0, 0, 0, 0.05);
-}
-
-html.dark #theme-toggle {
- color: var(--muted-dark);
-}
-
-html.dark #theme-toggle:hover {
- background: rgba(255, 255, 255, 0.08);
+ background: var(--hover-bg);
}
#theme-menu {
- display: block;
+ display: flex;
+ flex-direction: column;
position: absolute;
right: 0;
top: 46px;
- width: 180px;
+ width: 215px;
+ max-height: 75vh;
+ overflow-x: hidden;
+ overflow-y: auto;
+ scrollbar-width: thin;
+ scrollbar-color: var(--border) transparent;
padding: 8px;
border-radius: 16px;
- background: var(--bg-light);
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
+ background: var(--bg-menu);
+ border: 1px solid var(--border);
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
z-index: 50;
opacity: 0;
visibility: hidden;
transform: translateY(-8px) scale(0.96);
transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.2s;
pointer-events: none;
+ box-sizing: border-box;
}
-html.dark #theme-menu {
- background: var(--bg-dark);
+#theme-menu::-webkit-scrollbar,
+#theme-seg-menu::-webkit-scrollbar {
+ width: 4px;
+}
+
+#theme-menu::-webkit-scrollbar-thumb,
+#theme-seg-menu::-webkit-scrollbar-thumb {
+ background: var(--border);
+ border-radius: 4px;
+}
+
+#theme-menu::-webkit-scrollbar-track,
+#theme-seg-menu::-webkit-scrollbar-track {
+ background: transparent;
}
#theme-menu.open {
@@ -368,37 +331,77 @@ html.dark #theme-menu {
pointer-events: auto;
}
+.theme-menu-divider {
+ height: 1px;
+ margin: 6px 6px;
+ background: var(--border);
+ flex-shrink: 0;
+}
+
+.theme-menu-label {
+ font-size: 11px;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--muted);
+ padding: 6px 10px 4px;
+ text-align: left;
+ user-select: none;
+}
+
#theme-menu button {
display: flex;
align-items: center;
+ justify-content: flex-start;
+ text-align: left;
gap: 10px;
width: 100%;
padding: 8px 10px;
border: none;
border-radius: 10px;
background: none;
- color: inherit;
+ color: var(--text);
font: inherit;
- font-size: 14px;
+ font-size: 13.5px;
cursor: pointer;
+ box-sizing: border-box;
+ flex-shrink: 0;
}
#theme-menu button:hover {
- background: rgba(0, 0, 0, 0.05);
+ background: var(--hover-bg);
}
-html.dark #theme-menu button:hover {
- background: rgba(255, 255, 255, 0.08);
+#theme-menu button .ico {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+ color: var(--muted);
+}
+
+#theme-menu button span {
+ flex: 1;
+ text-align: left;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
#theme-menu .check {
margin-left: auto;
+ flex-shrink: 0;
font-style: normal;
+ font-size: 13px;
visibility: hidden;
}
#theme-menu button.on {
font-weight: 600;
+ color: var(--text-heading);
+}
+
+#theme-menu button.on .ico {
+ color: var(--text-heading);
}
#theme-menu button.on .check {
@@ -406,11 +409,146 @@ html.dark #theme-menu button:hover {
}
#theme-seg {
+ position: relative;
display: none;
gap: 4px;
}
-#theme-seg button {
+#theme-seg-menu {
+ position: absolute;
+ top: calc(100% + 8px);
+ right: 0;
+ width: 180px;
+ max-height: 320px;
+ overflow-y: auto;
+ padding: 6px;
+ border-radius: 14px;
+ background: var(--bg-menu);
+ border: 1px solid var(--border);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
+ z-index: 250;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(-6px) scale(0.96);
+ transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.2s;
+ pointer-events: none;
+}
+
+#theme-seg-menu.open {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0) scale(1);
+ pointer-events: auto;
+}
+
+#theme-seg-menu {
+ position: absolute;
+ top: calc(100% + 8px);
+ right: 0;
+ width: 215px;
+ max-height: 340px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ scrollbar-width: thin;
+ scrollbar-color: var(--border) transparent;
+ padding: 6px;
+ border-radius: 14px;
+ background: var(--bg-menu);
+ border: 1px solid var(--border);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
+ z-index: 250;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(-6px) scale(0.96);
+ transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.2s;
+ pointer-events: none;
+ box-sizing: border-box;
+}
+
+#theme-seg-menu button {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ text-align: left;
+ gap: 10px;
+ width: 100%;
+ height: auto;
+ min-height: 36px;
+ padding: 8px 10px;
+ border: none;
+ border-radius: 8px;
+ background: none;
+ color: var(--text);
+ font: inherit;
+ font-size: 13.5px;
+ cursor: pointer;
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
+
+#theme-seg-menu button:hover {
+ background: var(--hover-bg);
+}
+
+#theme-seg-menu button .ico {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+ color: var(--muted);
+}
+
+#theme-seg-menu button span {
+ display: block;
+ flex: 1;
+ text-align: left;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: var(--text);
+}
+
+#theme-seg-menu button.on span {
+ color: var(--text-heading);
+ font-weight: 600;
+}
+
+#theme-seg-menu button.on .ico {
+ color: var(--text-heading);
+}
+
+#theme-seg-menu button .check {
+ margin-left: auto;
+ flex-shrink: 0;
+ font-style: normal;
+ font-size: 13px;
+ visibility: hidden;
+}
+
+#theme-seg-menu button.on .check {
+ visibility: visible;
+ color: var(--text-heading);
+}
+
+#theme-seg-menu button:hover {
+ background: var(--hover-bg);
+}
+
+#theme-seg-menu button.on {
+ font-weight: 600;
+ color: var(--text-heading);
+}
+
+#theme-seg-menu .check {
+ margin-left: auto;
+ font-style: normal;
+ visibility: hidden;
+}
+
+#theme-seg-menu button.on .check {
+ visibility: visible;
+}
+
+#theme-seg>button {
display: flex;
align-items: center;
justify-content: center;
@@ -419,22 +557,14 @@ html.dark #theme-menu button:hover {
border: none;
border-radius: 50%;
background: none;
- color: var(--muted-light);
+ color: var(--muted);
cursor: pointer;
+ flex-shrink: 0;
}
-html.dark #theme-seg button {
- color: var(--muted-dark);
-}
-
-#theme-seg button.on {
- background: rgba(0, 0, 0, 0.07);
- color: var(--text-light);
-}
-
-html.dark #theme-seg button.on {
- background: rgba(255, 255, 255, 0.1);
- color: var(--text-dark);
+#theme-seg>button.on {
+ background: var(--hover-bg);
+ color: var(--text-heading);
}
#mobile-bar {
@@ -444,14 +574,9 @@ html.dark #theme-seg button.on {
gap: 8px;
padding: 10px 20px;
font-size: 14px;
- color: var(--muted-light);
+ color: var(--muted);
background: transparent;
- border-top: 1px solid rgba(0, 0, 0, 0.05);
-}
-
-html.dark #mobile-bar {
- color: var(--muted-dark);
- border-top: 1px solid rgba(255, 255, 255, 0.08);
+ border-top: 1px solid var(--border-subtle);
}
#mobile-bar button {
@@ -479,11 +604,7 @@ html.dark #mobile-bar {
}
.mobile-crumbs .crumb-group {
- color: var(--muted-light);
-}
-
-html.dark .mobile-crumbs .crumb-group {
- color: var(--muted-dark);
+ color: var(--muted);
}
.mobile-crumbs .crumb-sep {
@@ -492,28 +613,19 @@ html.dark .mobile-crumbs .crumb-group {
}
.mobile-crumbs .crumb-page {
- color: var(--text-light);
+ color: var(--text);
font-weight: 600;
cursor: pointer;
user-select: none;
}
-html.dark .mobile-crumbs .crumb-page {
- color: var(--text-dark);
-}
-
.mobile-crumbs .crumb-page:hover {
text-decoration: underline;
text-underline-offset: 3px;
}
.mobile-crumbs .crumb-page.muted {
- color: var(--muted-light);
- font-weight: 400;
-}
-
-html.dark .mobile-crumbs .crumb-page.muted {
- color: var(--muted-dark);
+ color: var(--muted);
font-weight: 400;
}
@@ -533,17 +645,13 @@ html.dark .mobile-crumbs .crumb-page.muted {
}
.mobile-crumbs .crumb-heading {
- color: var(--text-light);
+ color: var(--text-heading);
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
flex-shrink: 1;
}
-html.dark .mobile-crumbs .crumb-heading {
- color: var(--text-dark);
-}
-
.mobile-tabs {
display: none;
position: relative;
@@ -557,27 +665,19 @@ html.dark .mobile-crumbs .crumb-heading {
width: 100%;
padding: 8px 12px;
border: none;
- background: rgba(25, 25, 25, 0.1);
+ background: var(--hover-bg);
border-radius: 100px;
- color: var(--text-light);
+ color: var(--text-heading);
font: inherit;
font-size: 15px;
cursor: pointer;
}
-html.dark .mt-btn {
- color: var(--text-dark);
-}
-
.mt-btn .ico {
- color: var(--muted-light);
+ color: var(--muted);
transition: transform 0.15s ease;
}
-html.dark .mt-btn .ico {
- color: var(--muted-dark);
-}
-
.mobile-tabs.open .mt-btn .ico {
transform: rotate(180deg);
}
@@ -591,9 +691,9 @@ html.dark .mt-btn .ico {
z-index: 5;
padding: 6px;
border-radius: 16px;
- background: var(--bg-light);
- border: 1px solid var(--border-light);
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08);
+ background: var(--bg-menu);
+ border: 1px solid var(--border);
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
opacity: 0;
visibility: hidden;
transform: translateY(-8px) scale(0.97);
@@ -601,12 +701,6 @@ html.dark .mt-btn .ico {
pointer-events: none;
}
-html.dark .mt-menu {
- background: #000000;
- border: 1px solid rgba(255, 255, 255, 0.1);
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.6);
-}
-
.mobile-tabs.open .mt-menu {
opacity: 1;
visibility: visible;
@@ -626,35 +720,22 @@ html.dark .mt-menu {
font: inherit;
font-size: 14px;
font-weight: 500;
- color: var(--muted-light);
+ color: var(--muted);
cursor: pointer;
text-align: left;
transition: background 0.15s ease, color 0.15s ease;
}
-html.dark .mt-menu .mt-item {
- color: #a3a3a3;
-}
-
.mt-menu .mt-item:hover {
- background: rgba(0, 0, 0, 0.05);
- color: var(--text-light);
-}
-
-html.dark .mt-menu .mt-item:hover {
- background: rgba(255, 255, 255, 0.06);
- color: #ffffff;
+ background: var(--hover-bg);
+ color: var(--text-heading);
}
.mt-menu .mt-item.on {
- color: var(--text-light);
+ color: var(--text-heading);
font-weight: 600;
}
-html.dark .mt-menu .mt-item.on {
- color: #ffffff;
-}
-
.mt-menu .mt-item svg {
display: none;
width: 16px;
@@ -762,17 +843,13 @@ body.is-home main.prose {
#sidebar #theme-seg {
display: flex;
align-items: center;
- background: rgba(0, 0, 0, 0.05);
+ background: var(--hover-bg);
border-radius: 50px;
padding: 2px 4px;
gap: 2px;
}
- html.dark #sidebar #theme-seg {
- background: rgba(50, 50, 50, 0.08);
- }
-
- #sidebar #theme-seg button {
+ #sidebar #theme-seg>button {
display: flex;
align-items: center;
justify-content: center;
@@ -781,22 +858,14 @@ body.is-home main.prose {
border: none;
border-radius: 50%;
background: none;
- color: var(--muted-light);
+ color: var(--muted);
cursor: pointer;
padding: 0;
+ flex-shrink: 0;
}
- html.dark #sidebar #theme-seg button {
- color: var(--muted-dark);
- }
-
- #sidebar #theme-seg button.on {
- color: var(--text-light);
- font-weight: 900;
- }
-
- html.dark #sidebar #theme-seg button.on {
- color: var(--text-dark);
+ #sidebar #theme-seg>button.on {
+ color: var(--text-heading);
font-weight: 900;
}
@@ -820,18 +889,14 @@ body.is-home main.prose {
height: 100dvh !important;
max-height: 100vh !important;
padding: 0 16px 20px;
- background: var(--bg-light);
+ background: var(--bg);
transform: translateX(-100%);
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
- box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15);
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.35);
border-radius: 0 35px 35px 0;
z-index: 200;
}
- html.dark #sidebar {
- background: var(--bg-dark);
- }
-
#sidebar.open {
transform: translateX(0);
}
diff --git a/assets/styling/prose.css b/assets/styling/prose.css
index 7e83520..df87ac4 100644
--- a/assets/styling/prose.css
+++ b/assets/styling/prose.css
@@ -10,11 +10,7 @@ main.prose .eyebrow {
font-size: 14px;
font-weight: 600;
margin: 0 0 8px;
- color: var(--text-light);
-}
-
-html.dark main.prose .eyebrow {
- color: var(--text-dark);
+ color: var(--text);
}
main.prose h1 {
@@ -22,19 +18,15 @@ main.prose h1 {
font-weight: 700;
letter-spacing: 0;
margin: 0 0 6px;
- color: #111827;
+ color: var(--text-heading);
}
main.prose .page-description {
- color: var(--muted-light);
+ color: var(--muted);
font-size: 18px;
margin: 0 0 32px;
}
-html.dark main.prose .page-description {
- color: var(--muted-dark);
-}
-
main.prose h2 {
font-size: 22px;
font-weight: 700;
@@ -56,44 +48,25 @@ main.prose h3 {
main.prose h2,
main.prose h3 {
scroll-margin-top: 130px;
- color: #111827;
-}
-
-html.dark main.prose h1,
-html.dark main.prose h2,
-html.dark main.prose h3 {
- color: var(--text-dark);
+ color: var(--text-heading);
}
main.prose p,
main.prose li {
- color: #4b5563;
+ color: var(--text);
line-height: 1.75;
}
-html.dark main.prose p,
-html.dark main.prose li {
- color: #a1a1aa;
-}
-
main.prose strong {
- color: var(--text-light);
-}
-
-html.dark main.prose strong {
- color: var(--text-dark);
+ color: var(--text-heading);
}
main.prose a {
- color: var(--text-light);
+ color: var(--text);
font-weight: 600;
text-decoration: underline;
}
-html.dark main.prose a {
- color: var(--text-dark);
-}
-
main.prose ul,
main.prose ol {
padding-left: 22px;
@@ -119,23 +92,21 @@ main.prose hr {
}
main.prose code {
- background: rgba(250, 250, 250, 0.5);
+ background: var(--code-inline-bg);
+ color: var(--code-inline-text);
font-family: var(--mono);
font-size: 13px;
padding: 2px 6px;
border-radius: 5px;
}
-html.dark main.prose code {
- background: rgba(5, 5, 5);
-}
-
main.prose pre {
margin: 16px 0;
padding: 16px 20px;
border-radius: 25px;
overflow-x: auto;
- background: rgba(250, 250, 250);
+ background: var(--bg-code);
+ color: var(--code-text);
--fade-l: 0px;
--fade-r: 0px;
scrollbar-width: none;
@@ -143,14 +114,11 @@ main.prose pre {
mask-image: linear-gradient(to right, transparent 0, #000 var(--fade-l), #000 calc(100% - var(--fade-r)), transparent 100%);
}
-html.dark main.prose pre {
- background: rgba(5, 5, 5);
-}
-
main.prose pre code {
background: none;
padding: 0;
font-size: 13px;
+ color: inherit;
}
.table-wrap {
@@ -185,22 +153,15 @@ th {
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
- color: var(--muted-light);
+ color: var(--muted);
white-space: nowrap;
}
-html.dark th {
- color: var(--muted-dark);
-}
-
td {
padding: 14px 5px;
vertical-align: top;
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
-}
-
-html.dark td {
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+ border-bottom: 1px solid var(--border-subtle);
+ color: var(--text);
}
tbody tr:last-child td {
@@ -212,7 +173,7 @@ tbody tr {
}
tbody tr:hover {
- background: rgba(0, 0, 0, 0.02);
+ background: var(--hover-bg);
}
td code {
@@ -241,20 +202,16 @@ td code {
}
.callout-note {
- background: rgba(5, 5, 5, 0.08);
-}
-
-html.dark .callout-note {
- background: rgba(50, 50, 50, 0.1);
+ background: var(--callout-note-bg);
}
.callout-info {
- background: rgba(39, 39, 39, 0.08);
+ background: var(--callout-info-bg);
}
.callout-warning {
- background: #fefce8 !important;
- color: #854d0e !important;
+ background: var(--callout-warning-bg) !important;
+ color: var(--callout-warning-text) !important;
}
.callout-warning p,
@@ -262,16 +219,6 @@ html.dark .callout-note {
color: inherit !important;
}
-html.dark .callout-warning {
- background: oklab(68.064% 0.0348215 0.137956 / 0.2) !important;
- color: #fde047 !important;
-}
-
-html.dark .callout-warning p,
-html.dark .callout-warning strong {
- color: inherit !important;
-}
-
aside#toc {
width: var(--toc-width);
flex-shrink: 0;
@@ -299,7 +246,7 @@ aside#toc .toc-title {
font-size: 14px;
font-weight: 600;
line-height: 20px;
- color: var(--text-light);
+ color: var(--text-heading);
margin-bottom: 2px;
}
@@ -308,12 +255,8 @@ aside#toc .toc-title::before {
width: 16px;
height: 16px;
background: currentColor;
- -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 6h16M4 12h10M4 18h14'/%3E%3C/svg%3E") center / contain no-repeat;
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 6h16M4 12h10M4 18h14'/%3E%3C/svg%3E") center / contain no-repeat;
-}
-
-html.dark aside#toc .toc-title {
- color: var(--text-dark);
+ -webkit-mask: var(--ico-toc-mask) center / contain no-repeat;
+ mask: var(--ico-toc-mask) center / contain no-repeat;
}
aside#toc ul {
@@ -327,30 +270,18 @@ aside#toc li a {
padding: 6px 0;
font-size: 14px;
line-height: 20px;
- color: var(--muted-light);
-}
-
-html.dark aside#toc li a {
- color: var(--muted-dark);
+ color: var(--muted);
}
aside#toc li a:hover {
- color: var(--text-light);
-}
-
-html.dark aside#toc li a:hover {
- color: var(--text-dark);
+ color: var(--text-heading);
}
aside#toc li a.active {
- color: var(--text-light);
+ color: var(--text-heading);
font-weight: 600;
}
-html.dark aside#toc li a.active {
- color: var(--text-dark);
-}
-
@media (max-width: 900px) {
aside#toc {
display: none;
diff --git a/assets/styling/roots.css b/assets/styling/roots.css
index 842f7da..e0ff05e 100644
--- a/assets/styling/roots.css
+++ b/assets/styling/roots.css
@@ -1,20 +1,511 @@
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap");
-:root {
- --bg-light: #ffffff;
- --bg-dark: #000000;
- --text-light: #0b0b0c;
- --text-dark: #f3f3f3;
- --muted-light: #6b7280;
- --muted-dark: #a3a3a3;
+:root,
+:root[data-theme="dark"] {
+ --bg: #000000;
+ --text: #f3f3f3;
+ --text-heading: #ffffff;
+ --muted: #a3a3a3;
+ --border: #2b2b2b98;
+ --bg-elevated: rgba(255, 255, 255, 0.08);
+ --bg-card: rgba(25, 25, 25, 0.2);
+ --bg-card-hover: rgba(28, 28, 28, 0.8);
+ --bg-code: #050505;
+ --code-inline-bg: #050505;
+ --code-inline-text: #f3f3f3;
+ --code-text: #abb2bf;
+ --bg-menu: #000000;
+ --bg-modal: rgba(10, 10, 10, 0.35);
+ --hover-bg: rgba(255, 255, 255, 0.08);
+ --search-bg: rgba(50, 50, 50, 0.1);
+ --search-panel-bg: rgba(10, 10, 10, 0.6);
+ --code-group-bg: #0d0d0d;
+ --code-group-panel-bg: #000000;
+ --code-tab-active: #ffffff;
+ --footer-border: rgba(255, 255, 255, 0.08);
+ --border-subtle: rgba(255, 255, 255, 0.05);
+ --btn-primary-bg: #ffffff;
+ --btn-primary-text: #000000;
+ --btn-home-bg: #ffffff;
+ --btn-home-text: #000000;
+ --callout-note-bg: rgba(50, 50, 50, 0.1);
+ --callout-info-bg: rgba(39, 39, 39, 0.08);
+ --callout-warning-bg: rgba(180, 120, 0, 0.18);
+ --callout-warning-text: #fde047;
+ --body-radial-tint: rgba(0, 0, 0, 0.7);
+ --skeleton-pulse-1: rgba(255, 255, 255, 0.05);
+ --skeleton-pulse-2: rgba(255, 255, 255, 0.12);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(255, 255, 255, 0.3);
+
+ --hl-comment: #5c6370;
+ --hl-punct: #abb2bf;
+ --hl-func: #61afef;
+ --hl-keyword: #c678dd;
+ --hl-string: #98c379;
+ --hl-var: #e06c75;
+ --hl-op: #56b6c2;
+ --hl-num: #d19a66;
+ --hl-param: #d19a66;
+ --hl-class: #e5c07b;
+ --hl-tag: #e06c75;
+ --hl-deleted-color: #e06c75;
+ --hl-deleted-bg: rgba(224, 108, 117, 0.15);
+ --hl-inserted-color: #98c379;
+ --hl-inserted-bg: rgba(152, 195, 121, 0.15);
+
--sidebar-width: 150px;
--toc-width: 240px;
--header-height: 148px;
--font: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
- --border-light: #e5e7eb;
- --border-dark: #2b2b2b98;
- --bg-elevated: rgba(255, 255, 255, 0.08);
+
+ --ico-toc-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 6h16M4 12h10M4 18h14'/%3E%3C/svg%3E");
+ --ico-check-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
+ --ico-chevron-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
+ --ico-search-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E");
+ --ico-close-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E");
+}
+
+:root[data-theme="light"] {
+ --bg: #ffffff;
+ --text: #0b0b0c;
+ --text-heading: #111827;
+ --muted: #6b7280;
+ --border: #e5e7eb;
+ --bg-elevated: rgba(0, 0, 0, 0.05);
+ --bg-card: rgba(240, 240, 240, 0.85);
+ --bg-card-hover: rgba(225, 225, 225, 0.95);
+ --bg-code: #fafafa;
+ --code-inline-bg: rgba(240, 240, 240, 0.8);
+ --code-inline-text: #0b0b0c;
+ --code-text: #24292e;
+ --bg-menu: #ffffff;
+ --bg-modal: rgba(240, 240, 240, 0.7);
+ --hover-bg: rgba(0, 0, 0, 0.05);
+ --search-bg: rgba(0, 0, 0, 0.05);
+ --search-panel-bg: rgba(255, 255, 255, 0.85);
+ --code-group-bg: #f4f4f5;
+ --code-group-panel-bg: #ffffff;
+ --code-tab-active: #0b0b0c;
+ --footer-border: rgba(0, 0, 0, 0.08);
+ --border-subtle: rgba(0, 0, 0, 0.05);
+ --btn-primary-bg: #000000;
+ --btn-primary-text: #ffffff;
+ --btn-home-bg: #000000;
+ --btn-home-text: #ffffff;
+ --callout-note-bg: rgba(5, 5, 5, 0.06);
+ --callout-info-bg: rgba(39, 39, 39, 0.06);
+ --callout-warning-bg: #fefce8;
+ --callout-warning-text: #854d0e;
+ --body-radial-tint: rgba(255, 255, 255, 0.7);
+ --skeleton-pulse-1: rgba(0, 0, 0, 0.05);
+ --skeleton-pulse-2: rgba(0, 0, 0, 0.12);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(0, 0, 0, 0.3);
+
+ --hl-comment: #6a737d;
+ --hl-punct: #24292e;
+ --hl-func: #6f42c1;
+ --hl-keyword: #d73a49;
+ --hl-string: #22863a;
+ --hl-var: #e36209;
+ --hl-op: #d73a49;
+ --hl-num: #005cc5;
+ --hl-param: #b08800;
+ --hl-class: #6f42c1;
+ --hl-tag: #22863a;
+ --hl-deleted-color: #b31d28;
+ --hl-deleted-bg: #ffeef0;
+ --hl-inserted-color: #22863a;
+ --hl-inserted-bg: #f0fff4;
+}
+
+:root[data-theme="midnight"] {
+ --bg: #070913;
+ --text: #e2e8f0;
+ --text-heading: #f8fafc;
+ --muted: #7f8ea3;
+ --border: #1a2234;
+ --bg-elevated: rgba(30, 41, 59, 0.5);
+ --bg-card: rgba(15, 23, 42, 0.55);
+ --bg-card-hover: rgba(30, 41, 59, 0.7);
+ --bg-code: #0b1120;
+ --code-inline-bg: #0f172a;
+ --code-inline-text: #38bdf8;
+ --code-text: #cbd5e1;
+ --bg-menu: #0b1120;
+ --bg-modal: rgba(11, 17, 32, 0.75);
+ --hover-bg: rgba(56, 189, 248, 0.08);
+ --search-bg: rgba(30, 41, 59, 0.4);
+ --search-panel-bg: rgba(11, 17, 32, 0.85);
+ --code-group-bg: #0b1329;
+ --code-group-panel-bg: #070913;
+ --code-tab-active: #38bdf8;
+ --footer-border: #1e293b;
+ --border-subtle: rgba(255, 255, 255, 0.06);
+ --btn-primary-bg: #38bdf8;
+ --btn-primary-text: #020617;
+ --btn-home-bg: #38bdf8;
+ --btn-home-text: #020617;
+ --callout-note-bg: rgba(56, 189, 248, 0.1);
+ --callout-info-bg: rgba(99, 102, 241, 0.12);
+ --callout-warning-bg: rgba(245, 158, 11, 0.15);
+ --callout-warning-text: #fbbf24;
+ --body-radial-tint: rgba(7, 9, 19, 0.85);
+ --skeleton-pulse-1: rgba(56, 189, 248, 0.05);
+ --skeleton-pulse-2: rgba(56, 189, 248, 0.15);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(56, 189, 248, 0.3);
+
+ --hl-comment: #64748b;
+ --hl-punct: #94a3b8;
+ --hl-func: #38bdf8;
+ --hl-keyword: #818cf8;
+ --hl-string: #34d399;
+ --hl-var: #f472b6;
+ --hl-op: #38bdf8;
+ --hl-num: #fbbf24;
+ --hl-param: #cbd5e1;
+ --hl-class: #67e8f9;
+ --hl-tag: #818cf8;
+ --hl-deleted-color: #f87171;
+ --hl-deleted-bg: rgba(248, 113, 113, 0.15);
+ --hl-inserted-color: #34d399;
+ --hl-inserted-bg: rgba(52, 211, 153, 0.15);
+}
+
+:root[data-theme="nord"] {
+ --bg: #2e3440;
+ --text: #eceff4;
+ --text-heading: #88c0d0;
+ --muted: #d8dee9;
+ --border: #3b4252;
+ --bg-elevated: rgba(67, 76, 94, 0.5);
+ --bg-card: rgba(59, 66, 82, 0.5);
+ --bg-card-hover: rgba(67, 76, 94, 0.7);
+ --bg-code: #242933;
+ --code-inline-bg: #3b4252;
+ --code-inline-text: #eceff4;
+ --code-text: #d8dee9;
+ --bg-menu: #2e3440;
+ --bg-modal: rgba(46, 52, 64, 0.8);
+ --hover-bg: rgba(136, 192, 208, 0.1);
+ --search-bg: rgba(59, 66, 82, 0.5);
+ --search-panel-bg: rgba(46, 52, 64, 0.9);
+ --code-group-bg: #3b4252;
+ --code-group-panel-bg: #2e3440;
+ --code-tab-active: #88c0d0;
+ --footer-border: #3b4252;
+ --border-subtle: rgba(255, 255, 255, 0.05);
+ --btn-primary-bg: #88c0d0;
+ --btn-primary-text: #2e3440;
+ --btn-home-bg: #88c0d0;
+ --btn-home-text: #2e3440;
+ --callout-note-bg: rgba(129, 161, 193, 0.15);
+ --callout-info-bg: rgba(136, 192, 208, 0.15);
+ --callout-warning-bg: rgba(235, 203, 139, 0.15);
+ --callout-warning-text: #ebcb8b;
+ --body-radial-tint: rgba(46, 52, 64, 0.8);
+ --skeleton-pulse-1: rgba(216, 222, 233, 0.05);
+ --skeleton-pulse-2: rgba(216, 222, 233, 0.12);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(236, 239, 244, 0.3);
+
+ --hl-comment: #616e88;
+ --hl-punct: #d8dee9;
+ --hl-func: #88c0d0;
+ --hl-keyword: #81a1c1;
+ --hl-string: #a3be8c;
+ --hl-var: #d08770;
+ --hl-op: #81a1c1;
+ --hl-num: #b48ead;
+ --hl-param: #d8dee9;
+ --hl-class: #8fbcbb;
+ --hl-tag: #81a1c1;
+ --hl-deleted-color: #bf616a;
+ --hl-deleted-bg: rgba(191, 97, 106, 0.15);
+ --hl-inserted-color: #a3be8c;
+ --hl-inserted-bg: rgba(163, 190, 140, 0.15);
+}
+
+:root[data-theme="dracula"] {
+ --bg: #282a36;
+ --text: #f8f8f2;
+ --text-heading: #bd93f9;
+ --muted: #6272a4;
+ --border: #44475a;
+ --bg-elevated: rgba(68, 71, 90, 0.5);
+ --bg-card: rgba(68, 71, 90, 0.4);
+ --bg-card-hover: rgba(68, 71, 90, 0.7);
+ --bg-code: #1e1f29;
+ --code-inline-bg: #44475a;
+ --code-inline-text: #ff79c6;
+ --code-text: #f8f8f2;
+ --bg-menu: #282a36;
+ --bg-modal: rgba(40, 42, 54, 0.85);
+ --hover-bg: rgba(189, 147, 249, 0.12);
+ --search-bg: rgba(68, 71, 90, 0.5);
+ --search-panel-bg: rgba(40, 42, 54, 0.9);
+ --code-group-bg: #44475a;
+ --code-group-panel-bg: #282a36;
+ --code-tab-active: #ff79c6;
+ --footer-border: #44475a;
+ --border-subtle: rgba(255, 255, 255, 0.07);
+ --btn-primary-bg: #bd93f9;
+ --btn-primary-text: #282a36;
+ --btn-home-bg: #bd93f9;
+ --btn-home-text: #282a36;
+ --callout-note-bg: rgba(189, 147, 249, 0.15);
+ --callout-info-bg: rgba(139, 233, 253, 0.15);
+ --callout-warning-bg: rgba(241, 250, 140, 0.15);
+ --callout-warning-text: #f1fa8c;
+ --body-radial-tint: rgba(40, 42, 54, 0.85);
+ --skeleton-pulse-1: rgba(98, 114, 164, 0.08);
+ --skeleton-pulse-2: rgba(98, 114, 164, 0.2);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(189, 147, 249, 0.3);
+
+ --hl-comment: #6272a4;
+ --hl-punct: #f8f8f2;
+ --hl-func: #50fa7b;
+ --hl-keyword: #ff79c6;
+ --hl-string: #f1fa8c;
+ --hl-var: #ffb86c;
+ --hl-op: #ff79c6;
+ --hl-num: #bd93f9;
+ --hl-param: #ffb86c;
+ --hl-class: #8be9fd;
+ --hl-tag: #ff79c6;
+ --hl-deleted-color: #ff5555;
+ --hl-deleted-bg: rgba(255, 85, 85, 0.15);
+ --hl-inserted-color: #50fa7b;
+ --hl-inserted-bg: rgba(80, 250, 123, 0.15);
+}
+
+:root[data-theme="forest"] {
+ --bg: #0d1612;
+ --text: #e2ede5;
+ --text-heading: #86efac;
+ --muted: #739481;
+ --border: #1a2f24;
+ --bg-elevated: rgba(34, 76, 56, 0.35);
+ --bg-card: rgba(20, 42, 31, 0.45);
+ --bg-card-hover: rgba(28, 59, 44, 0.65);
+ --bg-code: #080f0c;
+ --code-inline-bg: #142a1f;
+ --code-inline-text: #86efac;
+ --code-text: #d1fae5;
+ --bg-menu: #0d1612;
+ --bg-modal: rgba(13, 22, 18, 0.85);
+ --hover-bg: rgba(134, 239, 172, 0.08);
+ --search-bg: rgba(26, 47, 36, 0.6);
+ --search-panel-bg: rgba(13, 22, 18, 0.9);
+ --code-group-bg: #15271e;
+ --code-group-panel-bg: #0d1612;
+ --code-tab-active: #86efac;
+ --footer-border: #1a2f24;
+ --border-subtle: rgba(255, 255, 255, 0.05);
+ --btn-primary-bg: #4ade80;
+ --btn-primary-text: #052e16;
+ --btn-home-bg: #4ade80;
+ --btn-home-text: #052e16;
+ --callout-note-bg: rgba(74, 222, 128, 0.12);
+ --callout-info-bg: rgba(45, 212, 191, 0.12);
+ --callout-warning-bg: rgba(250, 204, 21, 0.15);
+ --callout-warning-text: #fde047;
+ --body-radial-tint: rgba(13, 22, 18, 0.85);
+ --skeleton-pulse-1: rgba(134, 239, 172, 0.05);
+ --skeleton-pulse-2: rgba(134, 239, 172, 0.12);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(134, 239, 172, 0.3);
+
+ --hl-comment: #527561;
+ --hl-punct: #d1fae5;
+ --hl-func: #4ade80;
+ --hl-keyword: #2dd4bf;
+ --hl-string: #a7f3d0;
+ --hl-var: #fcd34d;
+ --hl-op: #34d399;
+ --hl-num: #fbbf24;
+ --hl-param: #e2ede5;
+ --hl-class: #6ee7b7;
+ --hl-tag: #2dd4bf;
+ --hl-deleted-color: #f87171;
+ --hl-deleted-bg: rgba(248, 113, 113, 0.15);
+ --hl-inserted-color: #4ade80;
+ --hl-inserted-bg: rgba(74, 222, 128, 0.15);
+}
+
+:root[data-theme="sunset"] {
+ --bg: #180d18;
+ --text: #fce7f3;
+ --text-heading: #fb7185;
+ --muted: #a77c98;
+ --border: #3b1d36;
+ --bg-elevated: rgba(80, 30, 70, 0.35);
+ --bg-card: rgba(50, 20, 45, 0.5);
+ --bg-card-hover: rgba(75, 30, 68, 0.65);
+ --bg-code: #120712;
+ --code-inline-bg: #3b1d36;
+ --code-inline-text: #fda4af;
+ --code-text: #fbcfe8;
+ --bg-menu: #180d18;
+ --bg-modal: rgba(24, 13, 24, 0.85);
+ --hover-bg: rgba(251, 113, 133, 0.1);
+ --search-bg: rgba(59, 29, 54, 0.5);
+ --search-panel-bg: rgba(24, 13, 24, 0.9);
+ --code-group-bg: #2d1329;
+ --code-group-panel-bg: #180d18;
+ --code-tab-active: #fb7185;
+ --footer-border: #3b1d36;
+ --border-subtle: rgba(255, 255, 255, 0.05);
+ --btn-primary-bg: #f43f5e;
+ --btn-primary-text: #ffffff;
+ --btn-home-bg: #f43f5e;
+ --btn-home-text: #ffffff;
+ --callout-note-bg: rgba(251, 113, 133, 0.15);
+ --callout-info-bg: rgba(192, 132, 252, 0.15);
+ --callout-warning-bg: rgba(251, 146, 60, 0.15);
+ --callout-warning-text: #fdba74;
+ --body-radial-tint: rgba(24, 13, 24, 0.85);
+ --skeleton-pulse-1: rgba(251, 113, 133, 0.05);
+ --skeleton-pulse-2: rgba(251, 113, 133, 0.15);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(251, 113, 133, 0.3);
+
+ --hl-comment: #835b77;
+ --hl-punct: #fbcfe8;
+ --hl-func: #fb7185;
+ --hl-keyword: #c084fc;
+ --hl-string: #f472b6;
+ --hl-var: #fb923c;
+ --hl-op: #f43f5e;
+ --hl-num: #facc15;
+ --hl-param: #fce7f3;
+ --hl-class: #e879f9;
+ --hl-tag: #c084fc;
+ --hl-deleted-color: #f87171;
+ --hl-deleted-bg: rgba(248, 113, 113, 0.15);
+ --hl-inserted-color: #4ade80;
+ --hl-inserted-bg: rgba(74, 222, 128, 0.15);
+}
+
+:root[data-theme="cyberpunk"] {
+ --bg: #050508;
+ --text: #00ffcc;
+ --text-heading: #ffe600;
+ --muted: #5e7a75;
+ --border: #1a2a26;
+ --bg-elevated: rgba(0, 255, 204, 0.08);
+ --bg-card: rgba(10, 20, 20, 0.7);
+ --bg-card-hover: rgba(20, 40, 35, 0.85);
+ --bg-code: #020204;
+ --code-inline-bg: rgba(0, 255, 204, 0.12);
+ --code-inline-text: #ffe600;
+ --code-text: #00ffcc;
+ --bg-menu: #08080f;
+ --bg-modal: rgba(5, 5, 8, 0.9);
+ --hover-bg: rgba(0, 255, 204, 0.1);
+ --search-bg: rgba(0, 255, 204, 0.08);
+ --search-panel-bg: rgba(8, 8, 15, 0.95);
+ --code-group-bg: #0e121a;
+ --code-group-panel-bg: #050508;
+ --code-tab-active: #ffe600;
+ --footer-border: #1a2a26;
+ --border-subtle: rgba(0, 255, 204, 0.15);
+ --btn-primary-bg: #ffe600;
+ --btn-primary-text: #000000;
+ --btn-home-bg: #00ffcc;
+ --btn-home-text: #000000;
+ --callout-note-bg: rgba(0, 255, 204, 0.12);
+ --callout-info-bg: rgba(255, 0, 128, 0.15);
+ --callout-warning-bg: rgba(255, 230, 0, 0.15);
+ --callout-warning-text: #ffe600;
+ --body-radial-tint: rgba(5, 5, 8, 0.9);
+ --skeleton-pulse-1: rgba(0, 255, 204, 0.05);
+ --skeleton-pulse-2: rgba(255, 230, 0, 0.12);
+ --spider-display: none;
+ --cobweb-display: none;
+ --spider-thread: rgba(0, 255, 204, 0.3);
+
+ --hl-comment: #3f5e58;
+ --hl-punct: #00ffcc;
+ --hl-func: #ffe600;
+ --hl-keyword: #ff007f;
+ --hl-string: #00f0ff;
+ --hl-var: #ff5500;
+ --hl-op: #ff007f;
+ --hl-num: #00ffcc;
+ --hl-param: #ffffff;
+ --hl-class: #ffe600;
+ --hl-tag: #ff007f;
+ --hl-deleted-color: #ff0055;
+ --hl-deleted-bg: rgba(255, 0, 85, 0.2);
+ --hl-inserted-color: #00ffcc;
+ --hl-inserted-bg: rgba(0, 255, 204, 0.2);
+}
+
+:root[data-theme="halloween"] {
+ --bg: #0a0604;
+ --text: #f5ebe6;
+ --text-heading: #ff7518;
+ --muted: #a37559;
+ --border: #3d1c0c;
+ --bg-elevated: rgba(255, 117, 24, 0.12);
+ --bg-card: rgba(28, 14, 8, 0.6);
+ --bg-card-hover: rgba(46, 21, 10, 0.85);
+ --bg-code: #050201;
+ --code-inline-bg: rgba(255, 117, 24, 0.15);
+ --code-inline-text: #ff944d;
+ --code-text: #fed7aa;
+ --bg-menu: #0e0704;
+ --bg-modal: rgba(10, 6, 4, 0.92);
+ --hover-bg: rgba(255, 117, 24, 0.12);
+ --search-bg: rgba(255, 117, 24, 0.08);
+ --search-panel-bg: rgba(14, 7, 4, 0.95);
+ --code-group-bg: #1c0e07;
+ --code-group-panel-bg: #0a0604;
+ --code-tab-active: #ff7518;
+ --footer-border: #3d1c0c;
+ --border-subtle: rgba(255, 117, 24, 0.15);
+ --btn-primary-bg: #ff7518;
+ --btn-primary-text: #000000;
+ --btn-home-bg: #ff7518;
+ --btn-home-text: #000000;
+ --callout-note-bg: rgba(255, 117, 24, 0.14);
+ --callout-info-bg: rgba(168, 85, 247, 0.15);
+ --callout-warning-bg: rgba(255, 154, 77, 0.18);
+ --callout-warning-text: #ffaa5e;
+ --body-radial-tint: rgba(10, 6, 4, 0.85);
+ --skeleton-pulse-1: rgba(255, 117, 24, 0.06);
+ --skeleton-pulse-2: rgba(255, 117, 24, 0.18);
+ --spider-display: block;
+ --cobweb-display: block;
+ --spider-thread: rgba(255, 154, 77, 0.4);
+
+ --hl-comment: #7c4f34;
+ --hl-punct: #fed7aa;
+ --hl-func: #ff944d;
+ --hl-keyword: #a855f7;
+ --hl-string: #84cc16;
+ --hl-var: #ff7518;
+ --hl-op: #a855f7;
+ --hl-num: #f59e0b;
+ --hl-param: #ffedd5;
+ --hl-class: #c084fc;
+ --hl-tag: #ff7518;
+ --hl-deleted-color: #ef4444;
+ --hl-deleted-bg: rgba(239, 68, 68, 0.2);
+ --hl-inserted-color: #84cc16;
+ --hl-inserted-bg: rgba(132, 204, 22, 0.2);
}
body.banner-dismissed {
@@ -31,15 +522,14 @@ html {
overflow-x: hidden;
scrollbar-width: none;
-ms-overflow-style: none;
-
}
body {
min-height: 100%;
margin: 0;
font-family: var(--font);
- background: var(--bg-light);
- color: var(--text-light);
+ background: var(--bg);
+ color: var(--text);
line-height: 1.65;
overflow-x: hidden;
-ms-overflow-style: none;
@@ -59,20 +549,7 @@ body::before {
inset: 0;
pointer-events: none;
z-index: -1;
- background: radial-gradient(ellipse at center,
- transparent 35%,
- rgba(255, 255, 255, 0.7) 100%);
-}
-
-html.dark body::before {
- background: radial-gradient(ellipse at center,
- transparent 35%,
- rgba(0, 0, 0, 0.7) 100%);
-}
-
-html.dark body {
- background: var(--bg-dark);
- color: var(--text-dark);
+ background: radial-gradient(ellipse at center, transparent 35%, var(--body-radial-tint) 100%);
}
.video-bg {
@@ -87,4 +564,101 @@ html.dark body {
a {
color: inherit;
text-decoration: none;
+}
+
+.cobweb {
+ display: var(--cobweb-display);
+ position: fixed;
+ width: 160px;
+ height: 160px;
+ pointer-events: none;
+ z-index: 35;
+ opacity: 0.8;
+}
+
+.cobweb-top-left {
+ top: 0;
+ left: 0;
+ transform: scaleX(-1);
+}
+
+.cobweb-top-right {
+ top: 0;
+ right: 0;
+}
+
+.cobweb-media {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+}
+
+.spider-container {
+ display: var(--spider-display);
+ position: fixed;
+ top: 0;
+ right: 12%;
+ pointer-events: none;
+ z-index: 36;
+ animation: spiderDescend 10s ease-in-out infinite;
+}
+
+.spider-thread {
+ width: 1.5px;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ background: var(--spider-thread);
+}
+
+.spider-body {
+ position: relative;
+ width: 48px;
+ height: 48px;
+ margin-top: 100px;
+ animation: spiderSway 3s ease-in-out infinite alternate;
+}
+
+.spider-media {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+ scale: 2;
+ padding-top: 20px;
+}
+
+@keyframes spiderDescend {
+ 0% {
+ transform: translateY(-80px);
+ }
+
+ 45% {
+ transform: translateY(240px);
+ }
+
+ 55% {
+ transform: translateY(240px);
+ }
+
+ 90% {
+ transform: translateY(10px);
+ }
+
+ 100% {
+ transform: translateY(-80px);
+ }
+}
+
+@keyframes spiderSway {
+ 0% {
+ transform: rotate(-10deg);
+ }
+
+ 100% {
+ transform: rotate(10deg);
+ }
}
\ No newline at end of file
diff --git a/index.html b/index.html
index 5ffa528..9809c39 100644
--- a/index.html
+++ b/index.html
@@ -87,35 +87,26 @@
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
+
+

+
+
+

+
+
+
+
+

+
+
-
-
Rights holders can request source removal — DMCA policy.