summaryrefslogtreecommitdiff
path: root/themes
diff options
context:
space:
mode:
authorHimanshu Sardana <himanshusardana2005@gmail.com>2026-03-17 00:42:57 +0000
committerHimanshu Sardana <himanshusardana2005@gmail.com>2026-03-17 00:42:57 +0000
commit7f523be08a01cc7d2952c19fa5ccf3645acc8e6a (patch)
treee98adf856a4e95da2725f210b22c67452c910b41 /themes
parent2bc62aaa80335269871949d4092f0d357904fbb4 (diff)
feat: add blog themes
Diffstat (limited to 'themes')
-rw-r--r--themes/everforest.css634
-rw-r--r--themes/modern-dark-2.css547
-rw-r--r--themes/modern-dark-catppuccin.css679
-rw-r--r--themes/modern-dark.css546
-rw-r--r--themes/modern-light.css492
-rw-r--r--themes/rose-pine.css1438
-rw-r--r--themes/terminal-gruvbox.css744
7 files changed, 5080 insertions, 0 deletions
diff --git a/themes/everforest.css b/themes/everforest.css
new file mode 100644
index 0000000..d4cbc12
--- /dev/null
+++ b/themes/everforest.css
@@ -0,0 +1,634 @@
+@import url("https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Familjen+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@300;400;500&display=swap");
+
+/* ─── Everforest Dark Tokens ────────────────────────────── */
+:root {
+ /* Backgrounds — from the Everforest palette */
+ --bg0: #2d3130; /* hard bg */
+ --bg1: #343f3e; /* main bg */
+ --bg2: #3a4845; /* soft bg */
+ --bg3: #445055; /* visual select */
+ --bg4: #4c5a5a; /* grey-0 */
+ --bg5: #596461; /* grey-1 */
+
+ /* Foreground */
+ --fg: #d3c6aa; /* main text */
+ --fg-dim: #9da9a0; /* dimmed */
+ --fg-muted: #5a6f68; /* muted */
+
+ /* Everforest accent spectrum */
+ --red: #e67e80;
+ --orange: #e69875;
+ --yellow: #dbbc7f;
+ --green: #a7c080; /* primary accent */
+ --aqua: #83c092;
+ --blue: #7fbbb3;
+ --purple: #d699b6;
+
+ /* Semantic aliases */
+ --accent: var(--green);
+ --accent-2: var(--aqua);
+ --accent-dim: rgba(167, 192, 128, 0.1);
+ --accent-glow: rgba(167, 192, 128, 0.06);
+ --warn: var(--yellow);
+ --error: var(--red);
+
+ /* Borders */
+ --border: #404d49;
+ --border-soft: rgba(167, 192, 128, 0.08);
+
+ /* Typography */
+ --serif: "Crimson Pro", Georgia, serif;
+ --sans: "Familjen Grotesk", system-ui, sans-serif;
+ --mono: "JetBrains Mono", ui-monospace, monospace;
+
+ --radius: 4px;
+ --max-w: 720px;
+ --transition: 160ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* ─── Reset ─────────────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+html {
+ scroll-behavior: smooth;
+}
+
+/* ─── Body ──────────────────────────────────────────────── */
+body {
+ margin: 0;
+ padding: 3.5rem 2rem 6rem;
+ background-color: var(--bg1);
+ background-image:
+ radial-gradient(
+ ellipse 90% 40% at 50% -10%,
+ rgba(83, 192, 146, 0.04) 0%,
+ transparent 65%
+ ),
+ url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23a7c080' fill-opacity='0.018'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/g%3E%3C/svg%3E");
+ color: var(--fg);
+ font-family: var(--serif);
+ line-height: 1.82;
+ font-size: 19px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--sans);
+ line-height: 1.18;
+ letter-spacing: -0.02em;
+ scroll-margin-top: 1.5rem;
+}
+
+h1 {
+ font-size: clamp(2.1rem, 5vw, 2.8rem);
+ font-weight: 700;
+ margin-bottom: 0.5rem;
+ color: var(--fg);
+ /* Subtle green shimmer on the heading */
+ text-shadow: 0 0 40px rgba(167, 192, 128, 0.18);
+}
+
+h2 {
+ font-size: 1.4rem;
+ font-weight: 600;
+ margin-top: 3.5rem;
+ color: var(--aqua);
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--border);
+}
+
+h3 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin-top: 2.2rem;
+ color: var(--yellow);
+}
+
+h4 {
+ font-size: 0.95rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ color: var(--fg-dim);
+ margin-top: 1.8rem;
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.35rem 0;
+ color: var(--fg);
+}
+
+h1 + p {
+ font-size: 1.06rem;
+ color: #bfb99f;
+ line-height: 1.88;
+}
+
+/* Drop cap */
+h1 + p::first-letter {
+ font-size: 3.4rem;
+ font-style: italic;
+ float: left;
+ line-height: 0.82;
+ margin: 0.1em 0.1em 0 0;
+ color: var(--green);
+}
+
+/* ─── Meta / Byline ─────────────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--fg-muted);
+ margin-bottom: 2.6rem;
+}
+
+/* ─── Links ─────────────────────────────────────────────── */
+a {
+ color: var(--aqua);
+ text-decoration-line: underline;
+ text-decoration-color: rgba(131, 192, 146, 0.35);
+ text-underline-offset: 3px;
+ text-decoration-thickness: 1px;
+ transition:
+ color var(--transition),
+ text-decoration-color var(--transition);
+}
+
+a:hover {
+ color: var(--green);
+ text-decoration-color: var(--green);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.3rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.6rem;
+ margin: 0.5rem 0;
+ color: var(--fg);
+}
+
+ul li::before {
+ content: "◆";
+ position: absolute;
+ left: 0;
+ font-size: 0.45rem;
+ top: 0.6em;
+ color: var(--green);
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+ol li {
+ counter-increment: ol-counter;
+}
+ol li::before {
+ content: counter(ol-counter, decimal-leading-zero);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.68rem;
+ color: var(--fg-muted);
+ top: 0.28em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 3.5rem auto;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--border) 25%,
+ var(--border) 75%,
+ transparent
+ );
+ position: relative;
+}
+
+hr::after {
+ content: "❧";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 0.8rem;
+ color: var(--fg-muted);
+ background: var(--bg1);
+ padding: 0 0.6rem;
+}
+
+/* ─── Blockquote ────────────────────────────────────────── */
+blockquote {
+ margin: 2.5rem 0;
+ padding: 1.2rem 1.6rem;
+ background: var(--bg2);
+ border-left: 3px solid var(--green);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ position: relative;
+}
+
+blockquote::before {
+ content: "\201C";
+ font-family: var(--serif);
+ font-size: 4rem;
+ line-height: 1;
+ color: var(--green);
+ opacity: 0.25;
+ position: absolute;
+ top: 0.1rem;
+ left: 1rem;
+ pointer-events: none;
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.08rem;
+ color: #c4bb9e;
+ position: relative;
+ z-index: 1;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.75rem;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.05em;
+ color: var(--fg-muted);
+ font-style: normal;
+}
+
+/* ─── Tables ────────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2rem 0;
+ font-size: 0.88rem;
+ font-family: var(--mono);
+ background: var(--bg2);
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--border);
+}
+
+thead {
+ background: var(--bg3);
+}
+
+th {
+ text-align: left;
+ padding: 0.7rem 1rem;
+ font-size: 0.67rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--aqua);
+ border-bottom: 1px solid var(--border);
+ font-weight: 500;
+}
+
+td {
+ padding: 0.6rem 1rem;
+ border-bottom: 1px solid var(--border-soft);
+ color: var(--fg-dim);
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+tbody tr:hover td {
+ background: rgba(167, 192, 128, 0.04);
+}
+
+/* ─── Inline Code ───────────────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.82rem;
+ background: var(--bg0);
+ color: var(--orange);
+ padding: 0.18rem 0.4rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ word-break: break-word;
+}
+
+/* ─── Code Blocks ───────────────────────────────────────── */
+pre {
+ background: var(--bg0);
+ border: 1px solid var(--border);
+ border-left: 3px solid var(--green);
+ padding: 1.4rem 1.6rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.55rem;
+ right: 0.85rem;
+ font-family: var(--mono);
+ font-size: 0.62rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--fg-muted);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: var(--fg);
+ font-size: 0.87rem;
+ line-height: 1.7;
+}
+
+/* Everforest syntax-flavoured spans (optional, use with a highlighter) */
+pre .kw {
+ color: var(--red);
+}
+pre .fn {
+ color: var(--yellow);
+}
+pre .str {
+ color: var(--green);
+}
+pre .num {
+ color: var(--purple);
+}
+pre .cm {
+ color: var(--fg-muted);
+ font-style: italic;
+}
+pre .kv {
+ color: var(--aqua);
+}
+
+/* ─── Images ────────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ margin: 2.5rem auto;
+}
+
+figure {
+ margin: 2.5rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--fg-muted);
+ text-align: center;
+ margin-top: 0.7rem;
+ letter-spacing: 0.04em;
+}
+
+/* ─── Aside / Callout ───────────────────────────────────── */
+aside,
+.note,
+.callout {
+ background: var(--accent-dim);
+ border: 1px solid rgba(167, 192, 128, 0.22);
+ border-radius: var(--radius);
+ padding: 1rem 1.25rem;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ color: var(--fg-dim);
+}
+
+aside strong,
+.callout strong {
+ font-family: var(--mono);
+ font-size: 0.67rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--green);
+ display: block;
+ margin-bottom: 0.35rem;
+}
+
+/* Variant callout types */
+.callout.warn {
+ background: rgba(219, 188, 127, 0.08);
+ border-color: rgba(219, 188, 127, 0.25);
+}
+.callout.warn strong {
+ color: var(--yellow);
+}
+.callout.error {
+ background: rgba(230, 126, 128, 0.08);
+ border-color: rgba(230, 126, 128, 0.25);
+}
+.callout.error strong {
+ color: var(--red);
+}
+.callout.info {
+ background: rgba(127, 187, 179, 0.08);
+ border-color: rgba(127, 187, 179, 0.25);
+}
+.callout.info strong {
+ color: var(--blue);
+}
+
+/* ─── Tags ───────────────────────────────────────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.64rem;
+ letter-spacing: 0.09em;
+ text-transform: uppercase;
+ padding: 0.22rem 0.6rem;
+ border: 1px solid var(--border);
+ border-radius: 2px;
+ color: var(--fg-muted);
+ margin-right: 0.4rem;
+ text-decoration: none;
+ transition: all var(--transition);
+}
+
+.tag:hover {
+ border-color: var(--green);
+ color: var(--green);
+ background: var(--accent-dim);
+ text-decoration: none;
+}
+
+/* ─── Navigation ─────────────────────────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 0 3rem;
+ border-bottom: 1px solid var(--border);
+ margin-bottom: 3.5rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 700;
+ font-size: 1.05rem;
+ letter-spacing: -0.02em;
+ color: var(--fg);
+ text-decoration: none;
+}
+
+nav .logo span {
+ color: var(--green);
+}
+
+nav ul {
+ display: flex;
+ gap: 2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--fg-muted);
+ text-decoration: none;
+ transition: color var(--transition);
+}
+
+nav a:hover {
+ color: var(--aqua);
+ text-decoration: none;
+}
+
+/* ─── Footer ─────────────────────────────────────────────── */
+footer {
+ margin-top: 5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.04em;
+ color: var(--fg-muted);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+/* ─── Reading Progress ───────────────────────────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: linear-gradient(90deg, var(--green), var(--aqua));
+ z-index: 999;
+ width: 0%;
+ box-shadow: 0 0 10px var(--accent-glow);
+ transition: width 0.1s linear;
+}
+
+/* ─── Selection ──────────────────────────────────────────── */
+::selection {
+ background: rgba(167, 192, 128, 0.22);
+ color: var(--fg);
+}
+
+/* ─── Scrollbar ──────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+::-webkit-scrollbar-track {
+ background: var(--bg0);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--bg4);
+ border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--fg-muted);
+}
+
+/* ─── Abbr ───────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dotted var(--fg-muted);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ─────────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.3rem 4rem;
+ font-size: 17px;
+ }
+ h1 {
+ font-size: 1.9rem;
+ }
+ h2 {
+ font-size: 1.25rem;
+ }
+ nav ul {
+ gap: 1.2rem;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 0.8rem;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+/* ─── Focus Accessibility ─────────────────────────────────── */
+:focus-visible {
+ outline: 2px solid var(--green);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/modern-dark-2.css b/themes/modern-dark-2.css
new file mode 100644
index 0000000..e71d96f
--- /dev/null
+++ b/themes/modern-dark-2.css
@@ -0,0 +1,547 @@
+@import url("https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@300;400;500&family=Syne:wght@400;600;700;800&display=swap");
+
+/* ─── Design Tokens ─────────────────────────────────────── */
+:root {
+ --bg: #060d1a;
+ --surface: #0b1525;
+ --surface-2: #101e30;
+ --border: #172540;
+ --border-soft: rgba(96, 165, 250, 0.07);
+ --text: #dde8f7;
+ --text-dim: #6b88ad;
+ --text-muted: #2e4460;
+ --accent: #60a5fa; /* electric blue */
+ --accent-2: #93c5fd; /* soft sky */
+ --accent-dim: rgba(96, 165, 250, 0.1);
+ --accent-glow: rgba(96, 165, 250, 0.12);
+ --serif: "Instrument Serif", Georgia, serif;
+ --sans: "Syne", system-ui, sans-serif;
+ --mono: "DM Mono", ui-monospace, monospace;
+ --radius: 4px;
+ --max-w: 740px;
+ --transition: 150ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* ─── Reset & Base ──────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ margin: 0;
+ padding: 4rem 2rem 6rem;
+ background-color: var(--bg);
+ background-image:
+ radial-gradient(
+ ellipse 80% 50% at 50% -20%,
+ rgba(96, 165, 250, 0.07) 0%,
+ transparent 60%
+ ),
+ url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%2360a5fa' fill-opacity='0.018'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/g%3E%3C/svg%3E");
+ color: var(--text);
+ font-family: var(--serif);
+ line-height: 1.8;
+ font-size: 19px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--sans);
+ font-weight: 700;
+ line-height: 1.15;
+ letter-spacing: -0.02em;
+ scroll-margin-top: 1.5rem;
+ color: #e8f0fc;
+}
+
+h1 {
+ font-size: clamp(2.2rem, 5vw, 3rem);
+ font-weight: 800;
+ margin-bottom: 1.2rem;
+ background: linear-gradient(135deg, #e8f0fc 55%, var(--accent) 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+h2 {
+ font-size: 1.5rem;
+ margin-top: 3.5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ color: var(--text);
+}
+
+h3 {
+ font-size: 1.15rem;
+ font-weight: 600;
+ margin-top: 2.2rem;
+ color: var(--text);
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.4rem 0;
+ color: #b8cce4;
+ font-size: 1.2rem;
+}
+
+/* Drop cap */
+h1 + p::first-letter {
+ font-family: var(--serif);
+ font-size: 3.6rem;
+ font-style: italic;
+ float: left;
+ line-height: 0.82;
+ margin: 0.08em 0.1em 0 0;
+ color: var(--accent);
+}
+
+/* ─── Article Meta / Byline ─────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ margin-bottom: 2.5rem;
+}
+
+/* ─── Links ─────────────────────────────────────────────── */
+a {
+ color: var(--accent-2);
+ text-decoration: none;
+ border-bottom: 1px solid var(--border);
+ transition:
+ color var(--transition),
+ border-color var(--transition);
+}
+
+a:hover {
+ color: #bfdbfe;
+ border-bottom-color: var(--accent);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.4rem 0 1.4rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.5rem;
+ margin: 0.55rem 0;
+ color: #b8cce4;
+}
+
+ul li::before {
+ content: "–";
+ position: absolute;
+ left: 0;
+ color: var(--accent);
+ font-family: var(--mono);
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+
+ol li {
+ counter-increment: ol-counter;
+}
+
+ol li::before {
+ content: counter(ol-counter, decimal-leading-zero);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--text-dim);
+ top: 0.22em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 3.5rem auto;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--border) 20%,
+ var(--border) 80%,
+ transparent
+ );
+ position: relative;
+}
+
+hr::after {
+ content: "✦";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 0.65rem;
+ color: var(--text-muted);
+ background: var(--bg);
+ padding: 0 0.5rem;
+}
+
+/* ─── Blockquote ────────────────────────────────────────── */
+blockquote {
+ margin: 2.5rem 0;
+ padding: 1.5rem 1.8rem;
+ background: var(--surface);
+ border-left: 2px solid var(--accent);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ position: relative;
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.1rem;
+ color: #ccddf0;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.06em;
+ color: var(--text-dim);
+ font-style: normal;
+}
+
+/* ─── Tables ────────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ font-family: var(--mono);
+ background: var(--surface);
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--border);
+}
+
+thead {
+ background: var(--surface-2);
+}
+
+th {
+ text-align: left;
+ padding: 0.75rem 1rem;
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--accent-2);
+ border-bottom: 1px solid var(--border);
+ font-weight: 500;
+}
+
+td {
+ padding: 0.65rem 1rem;
+ border-bottom: 1px solid var(--border-soft);
+ color: #a8bdd8;
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tr:hover td {
+ background: var(--border-soft);
+}
+
+/* ─── Inline Code ───────────────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.83rem;
+ background: var(--surface-2);
+ color: var(--accent);
+ padding: 0.18rem 0.4rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ word-break: break-word;
+}
+
+/* ─── Code Blocks ───────────────────────────────────────── */
+pre {
+ background: var(--surface);
+ border: 1px solid var(--border);
+ border-left: 2px solid var(--accent);
+ padding: 1.4rem 1.6rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.6rem;
+ right: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: #c4d8ee;
+ font-size: 0.87rem;
+ line-height: 1.65;
+}
+
+/* ─── Images ────────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ margin: 2rem auto;
+}
+
+figure {
+ margin: 2.5rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--text-dim);
+ text-align: center;
+ margin-top: 0.75rem;
+ letter-spacing: 0.04em;
+}
+
+/* ─── Aside / Callout ───────────────────────────────────── */
+aside,
+.note,
+.callout {
+ background: var(--accent-dim);
+ border: 1px solid rgba(96, 165, 250, 0.2);
+ border-radius: var(--radius);
+ padding: 1rem 1.2rem;
+ margin: 2rem 0;
+ font-size: 0.88rem;
+ color: #a8bdd8;
+}
+
+aside strong,
+.callout strong {
+ color: var(--accent);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ display: block;
+ margin-left: 3px;
+ margin-bottom: 0.4rem;
+}
+
+/* ─── Tags / Badges ─────────────────────────────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.25rem 0.6rem;
+ border: 1px solid var(--border);
+ border-radius: 2px;
+ color: var(--text-dim);
+ margin-right: 0.4rem;
+ text-decoration: none;
+ border-bottom: none;
+ transition: all var(--transition);
+}
+
+.tag:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ background: var(--accent-dim);
+}
+
+/* ─── Navigation ───────────────────────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.2rem 0 3rem;
+ border-bottom: 1px solid var(--border);
+ margin-bottom: 3.5rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 800;
+ font-size: 1.1rem;
+ letter-spacing: -0.02em;
+ color: var(--text);
+ border-bottom: none;
+}
+
+nav .logo span {
+ color: var(--accent);
+}
+
+nav ul {
+ display: flex;
+ gap: 2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ border-bottom: none;
+ transition: color var(--transition);
+}
+
+nav a:hover {
+ color: var(--accent);
+ border-bottom: none;
+}
+
+/* ─── Footer ───────────────────────────────────────────── */
+footer {
+ margin-top: 5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.05em;
+ color: var(--text-muted);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+/* ─── Reading Progress Bar ─────────────────────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: linear-gradient(90deg, var(--accent), var(--accent-2));
+ z-index: 999;
+ transform-origin: left;
+ width: 0%;
+ box-shadow: 0 0 10px var(--accent-glow);
+ transition: width 0.1s linear;
+}
+
+/* ─── Selection ────────────────────────────────────────── */
+::selection {
+ background: rgba(96, 165, 250, 0.2);
+ color: var(--text);
+}
+
+/* ─── Scrollbar ────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--bg);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--border);
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--text-muted);
+}
+
+/* ─── Abbr ─────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dotted var(--text-dim);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ───────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.2rem 4rem;
+ font-size: 17px;
+ }
+
+ h1 {
+ font-size: 2rem;
+ }
+ h2 {
+ font-size: 1.35rem;
+ }
+ nav ul {
+ gap: 1.2rem;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 1rem;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+/* ─── Focus Accessibility ──────────────────────────────── */
+:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/modern-dark-catppuccin.css b/themes/modern-dark-catppuccin.css
new file mode 100644
index 0000000..afd7f59
--- /dev/null
+++ b/themes/modern-dark-catppuccin.css
@@ -0,0 +1,679 @@
+@import url("https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@300;400;500&family=Syne:wght@400;600;700;800&display=swap");
+
+/* ─── Catppuccin Mocha Palette ──────────────────────────── */
+:root {
+ /* Base layers */
+ --crust: #11111b;
+ --mantle: #181825;
+ --base: #1e1e2e;
+ --surface-0: #313244;
+ --surface-1: #45475a;
+ --surface-2: #585b70;
+
+ /* Overlays */
+ --overlay-0: #6c7086;
+ --overlay-1: #7f849c;
+ --overlay-2: #9399b2;
+
+ /* Text */
+ --subtext-0: #a6adc8;
+ --subtext-1: #bac2de;
+ --text-full: #cdd6f4;
+
+ /* Accent spectrum — USE ALL OF THEM */
+ --rosewater: #f5e0dc;
+ --flamingo: #f2cdcd;
+ --pink: #f5c2e7;
+ --mauve: #cba6f7; /* h1 gradient anchor */
+ --red: #f38ba8;
+ --maroon: #eba0ac;
+ --peach: #fab387; /* inline code */
+ --yellow: #f9e2af; /* h3 */
+ --green: #a6e3a1; /* success / ul bullets */
+ --teal: #94e2d5; /* h2 */
+ --sky: #89dceb; /* links */
+ --sapphire: #74c7ec; /* primary accent */
+ --blue: #89b4fa; /* accent-2, progress */
+ --lavender: #b4befe; /* h1 gradient end */
+
+ /* Semantic mappings */
+ --bg: var(--base);
+ --surface: var(--mantle);
+ --surface-2: var(--crust);
+ --border: var(--surface-0);
+ --border-soft: rgba(180, 190, 254, 0.07);
+ --text: var(--text-full);
+ --text-dim: var(--overlay-1);
+ --text-muted: var(--overlay-0);
+ --accent: var(--sapphire);
+ --accent-2: var(--blue);
+ --accent-dim: rgba(116, 199, 236, 0.1);
+ --accent-glow: rgba(116, 199, 236, 0.12);
+
+ --serif: "Instrument Serif", Georgia, serif;
+ --sans: "Syne", system-ui, sans-serif;
+ --mono: "DM Mono", ui-monospace, monospace;
+ --radius: 4px;
+ --max-w: 720px;
+ --transition: 150ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* ─── Reset & Base ──────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ margin: 0;
+ padding: 4rem 2rem 6rem;
+ background-color: var(--base);
+ background-image:
+ radial-gradient(
+ ellipse 80% 50% at 50% -20%,
+ rgba(203, 166, 247, 0.07) 0%,
+ transparent 60%
+ ),
+ url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23cba6f7' fill-opacity='0.018'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/g%3E%3C/svg%3E");
+ color: var(--text-full);
+ font-family: var(--serif);
+ line-height: 1.8;
+ font-size: 19px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--sans);
+ font-weight: 700;
+ line-height: 1.15;
+ letter-spacing: -0.02em;
+ scroll-margin-top: 1.5rem;
+}
+
+/* h1 — mauve → lavender gradient */
+h1 {
+ font-size: clamp(2.2rem, 5vw, 3rem);
+ font-weight: 800;
+ margin-bottom: 1.2rem;
+ background: linear-gradient(
+ 135deg,
+ var(--text-full) 30%,
+ var(--mauve) 65%,
+ var(--lavender) 100%
+ );
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+/* h2 — teal */
+h2 {
+ font-size: 1.5rem;
+ margin-top: 3.5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--surface-0);
+ color: var(--teal);
+}
+
+/* h3 — yellow */
+h3 {
+ font-size: 1.15rem;
+ font-weight: 600;
+ margin-top: 2.2rem;
+ color: var(--yellow);
+}
+
+/* h4 — peach */
+h4 {
+ font-size: 1rem;
+ font-weight: 600;
+ margin-top: 1.8rem;
+ color: var(--peach);
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.4rem 0;
+ color: var(--subtext-1);
+ font-size: 1.2rem;
+}
+
+/* Drop cap — mauve */
+h1 + p::first-letter {
+ font-family: var(--serif);
+ font-size: 3.6rem;
+ font-style: italic;
+ float: left;
+ line-height: 0.82;
+ margin: 0.08em 0.1em 0 0;
+ color: var(--mauve);
+}
+
+/* ─── Article Meta / Byline ─────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--overlay-1);
+ margin-bottom: 2.5rem;
+}
+
+/* ─── Links — sky ───────────────────────────────────────── */
+a {
+ color: var(--sky);
+ text-decoration: none;
+ border-bottom: 1px solid var(--surface-0);
+ transition:
+ color var(--transition),
+ border-color var(--transition);
+}
+
+a:hover {
+ color: var(--sapphire);
+ border-bottom-color: var(--sapphire);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.4rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.5rem;
+ margin: 0.55rem 0;
+ color: var(--subtext-1);
+}
+
+/* ul bullets — green */
+ul li::before {
+ content: "–";
+ position: absolute;
+ left: 0;
+ color: var(--green);
+ font-family: var(--mono);
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+
+ol li {
+ counter-increment: ol-counter;
+}
+
+/* ol numbers — blue */
+ol li::before {
+ content: counter(ol-counter, decimal-leading-zero);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--blue);
+ top: 0.22em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 3.5rem auto;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--surface-0) 20%,
+ var(--surface-0) 80%,
+ transparent
+ );
+ position: relative;
+}
+
+hr::after {
+ content: "✦";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 0.65rem;
+ color: var(--surface-2);
+ background: var(--base);
+ padding: 0 0.5rem;
+}
+
+/* ─── Blockquote — flamingo / pink ──────────────────────── */
+blockquote {
+ margin: 2.5rem 0;
+ padding: 1.5rem 1.8rem;
+ background: var(--mantle);
+ border-left: 2px solid var(--pink);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ position: relative;
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.1rem;
+ color: var(--flamingo);
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.06em;
+ color: var(--overlay-0);
+ font-style: normal;
+}
+
+/* ─── Tables ───────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ font-family: var(--mono);
+ background: var(--mantle);
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--surface-0);
+}
+
+thead {
+ background: var(--crust);
+}
+
+/* th — lavender */
+th {
+ text-align: left;
+ padding: 0.75rem 1rem;
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--lavender);
+ border-bottom: 1px solid var(--surface-0);
+ font-weight: 500;
+}
+
+td {
+ padding: 0.65rem 1rem;
+ border-bottom: 1px solid var(--border-soft);
+ color: var(--subtext-0);
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tr:hover td {
+ background: rgba(180, 190, 254, 0.04);
+}
+
+/* ─── Inline Code — peach ───────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.83rem;
+ background: var(--crust);
+ color: var(--peach);
+ padding: 0.18rem 0.4rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--surface-0);
+ word-break: break-word;
+}
+
+/* ─── Code Blocks — green left border ──────────────────── */
+pre {
+ background: var(--mantle);
+ border: 1px solid var(--surface-0);
+ border-left: 2px solid var(--green);
+ padding: 1.4rem 1.6rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.6rem;
+ right: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--overlay-0);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: var(--text-full);
+ font-size: 0.87rem;
+ line-height: 1.65;
+}
+
+/* Optional: mocha syntax classes */
+pre .kw {
+ color: var(--mauve);
+}
+pre .fn {
+ color: var(--blue);
+}
+pre .str {
+ color: var(--green);
+}
+pre .num {
+ color: var(--peach);
+}
+pre .cm {
+ color: var(--overlay-0);
+ font-style: italic;
+}
+pre .kv {
+ color: var(--teal);
+}
+pre .type {
+ color: var(--yellow);
+}
+pre .err {
+ color: var(--red);
+}
+
+/* ─── Images ───────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--surface-0);
+ margin: 2rem auto;
+}
+
+figure {
+ margin: 2.5rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--overlay-1);
+ text-align: center;
+ margin-top: 0.75rem;
+ letter-spacing: 0.04em;
+}
+
+/* ─── Callout variants — full palette ───────────────────── */
+aside,
+.note,
+.callout {
+ background: rgba(116, 199, 236, 0.07);
+ border: 1px solid rgba(116, 199, 236, 0.2);
+ border-radius: var(--radius);
+ padding: 1rem 1.2rem;
+ margin: 2rem 0;
+ font-size: 0.88rem;
+ color: var(--subtext-0);
+}
+
+aside strong,
+.callout strong {
+ color: var(--sapphire);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ display: block;
+ margin-bottom: 0.4rem;
+}
+
+/* mauve — hint */
+.callout.hint {
+ background: rgba(203, 166, 247, 0.07);
+ border-color: rgba(203, 166, 247, 0.25);
+}
+.callout.hint strong {
+ color: var(--mauve);
+}
+
+/* yellow — warning */
+.callout.warn {
+ background: rgba(249, 226, 175, 0.07);
+ border-color: rgba(249, 226, 175, 0.25);
+}
+.callout.warn strong {
+ color: var(--yellow);
+}
+
+/* red — error */
+.callout.error {
+ background: rgba(243, 139, 168, 0.07);
+ border-color: rgba(243, 139, 168, 0.25);
+}
+.callout.error strong {
+ color: var(--red);
+}
+
+/* green — success */
+.callout.success {
+ background: rgba(166, 227, 161, 0.07);
+ border-color: rgba(166, 227, 161, 0.25);
+}
+.callout.success strong {
+ color: var(--green);
+}
+
+/* peach — tip */
+.callout.tip {
+ background: rgba(250, 179, 135, 0.07);
+ border-color: rgba(250, 179, 135, 0.25);
+}
+.callout.tip strong {
+ color: var(--peach);
+}
+
+/* ─── Tags — rosewater / flamingo on hover ─────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.25rem 0.6rem;
+ border: 1px solid var(--surface-0);
+ border-radius: 2px;
+ color: var(--overlay-2);
+ margin-right: 0.4rem;
+ text-decoration: none;
+ border-bottom: none;
+ transition: all var(--transition);
+}
+
+.tag:hover {
+ border-color: var(--rosewater);
+ color: var(--rosewater);
+ background: rgba(245, 224, 220, 0.07);
+ border-bottom: none;
+}
+
+/* ─── Navigation ───────────────────────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.2rem 0 3rem;
+ border-bottom: 1px solid var(--surface-0);
+ margin-bottom: 3.5rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 800;
+ font-size: 1.1rem;
+ letter-spacing: -0.02em;
+ color: var(--text-full);
+ border-bottom: none;
+}
+
+/* logo accent — mauve */
+nav .logo span {
+ color: var(--mauve);
+}
+
+nav ul {
+ display: flex;
+ gap: 2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--overlay-1);
+ border-bottom: none;
+ transition: color var(--transition);
+}
+
+nav a:hover {
+ color: var(--lavender);
+ border-bottom: none;
+}
+
+/* ─── Footer ───────────────────────────────────────────── */
+footer {
+ margin-top: 5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--surface-0);
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.05em;
+ color: var(--overlay-0);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+/* ─── Reading Progress — mauve → lavender ──────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: linear-gradient(
+ 90deg,
+ var(--mauve),
+ var(--blue),
+ var(--lavender)
+ );
+ z-index: 999;
+ transform-origin: left;
+ width: 0%;
+ box-shadow: 0 0 10px rgba(203, 166, 247, 0.2);
+ transition: width 0.1s linear;
+}
+
+/* ─── Selection — mauve ────────────────────────────────── */
+::selection {
+ background: rgba(203, 166, 247, 0.25);
+ color: var(--text-full);
+}
+
+/* ─── Scrollbar ────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--crust);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--surface-0);
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--surface-1);
+}
+
+/* ─── Abbr ─────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dotted var(--overlay-0);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ───────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.2rem 4rem;
+ font-size: 17px;
+ }
+
+ h1 {
+ font-size: 2rem;
+ }
+ h2 {
+ font-size: 1.35rem;
+ }
+ nav ul {
+ gap: 1.2rem;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 1rem;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+/* ─── Focus Accessibility ──────────────────────────────── */
+:focus-visible {
+ outline: 2px solid var(--lavender);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/modern-dark.css b/themes/modern-dark.css
new file mode 100644
index 0000000..be8d4f6
--- /dev/null
+++ b/themes/modern-dark.css
@@ -0,0 +1,546 @@
+@import url("https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@300;400;500&family=Syne:wght@400;600;700;800&display=swap");
+
+/* ─── Design Tokens ─────────────────────────────────────── */
+:root {
+ --bg: #0a0a0b;
+ --surface: #111113;
+ --surface-2: #18181c;
+ --border: #232328;
+ --border-soft: rgba(255, 255, 255, 0.06);
+ --text: #e8e8e4;
+ --text-dim: #7a7a80;
+ --text-muted: #3e3e46;
+ --accent: #c8f23a; /* electric lime – sharp single accent */
+ --accent-dim: rgba(200, 242, 58, 0.12);
+ --accent-glow: rgba(200, 242, 58, 0.08);
+ --serif: "Instrument Serif", Georgia, serif;
+ --sans: "Syne", system-ui, sans-serif;
+ --mono: "DM Mono", ui-monospace, monospace;
+ --radius: 4px;
+ --max-w: 720px;
+ --transition: 150ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* ─── Reset & Base ──────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ margin: 0;
+ padding: 4rem 2rem 6rem;
+ background-color: var(--bg);
+ background-image:
+ radial-gradient(
+ ellipse 80% 50% at 50% -20%,
+ rgba(200, 242, 58, 0.05) 0%,
+ transparent 60%
+ ),
+ url("data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ffffff' fill-opacity='0.015'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/g%3E%3C/svg%3E");
+ color: var(--text);
+ font-family: var(--serif);
+ line-height: 1.8;
+ font-size: 19px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--sans);
+ font-weight: 700;
+ line-height: 1.15;
+ letter-spacing: -0.02em;
+ scroll-margin-top: 1.5rem;
+ color: #f0f0ec;
+}
+
+h1 {
+ font-size: clamp(2.2rem, 5vw, 3rem);
+ font-weight: 800;
+ margin-bottom: 1.2rem;
+ /* Subtle accent underline on the first line */
+ background: linear-gradient(135deg, #f0f0ec 60%, var(--accent) 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+h2 {
+ font-size: 1.5rem;
+ margin-top: 3.5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ color: var(--text);
+}
+
+h3 {
+ font-size: 1.15rem;
+ font-weight: 600;
+ margin-top: 2.2rem;
+ color: var(--text);
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.4rem 0;
+ color: #c8c8c4;
+ font-size: 1.2rem;
+}
+
+/* Drop cap for first paragraph after h1 */
+h1 + p::first-letter {
+ font-family: var(--serif);
+ font-size: 3.6rem;
+ font-style: italic;
+ float: left;
+ line-height: 0.82;
+ margin: 0.08em 0.1em 0 0;
+ color: var(--accent);
+}
+
+/* ─── Article Meta / Byline ─────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ margin-bottom: 2.5rem;
+}
+
+/* ─── Links ─────────────────────────────────────────────── */
+a {
+ color: var(--text);
+ text-decoration: none;
+ border-bottom: 1px solid var(--border);
+ transition:
+ color var(--transition),
+ border-color var(--transition);
+}
+
+a:hover {
+ color: var(--accent);
+ border-bottom-color: var(--accent);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.4rem 0 1.4rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.5rem;
+ margin: 0.55rem 0;
+ color: #c8c8c4;
+}
+
+ul li::before {
+ content: "–";
+ position: absolute;
+ left: 0;
+ color: var(--accent);
+ font-family: var(--mono);
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+
+ol li {
+ counter-increment: ol-counter;
+}
+
+ol li::before {
+ content: counter(ol-counter, decimal-leading-zero);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--text-dim);
+ top: 0.22em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 3.5rem auto;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--border) 20%,
+ var(--border) 80%,
+ transparent
+ );
+ position: relative;
+}
+
+hr::after {
+ content: "✦";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ font-size: 0.65rem;
+ color: var(--text-muted);
+ background: var(--bg);
+ padding: 0 0.5rem;
+}
+
+/* ─── Blockquote ────────────────────────────────────────── */
+blockquote {
+ margin: 2.5rem 0;
+ padding: 1.5rem 1.8rem;
+ background: var(--surface);
+ border-left: 2px solid var(--accent);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ position: relative;
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.1rem;
+ color: #d8d8d4;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.06em;
+ color: var(--text-dim);
+ font-style: normal;
+}
+
+/* ─── Tables ────────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ font-family: var(--mono);
+ background: var(--surface);
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--border);
+}
+
+thead {
+ background: var(--surface-2);
+}
+
+th {
+ text-align: left;
+ padding: 0.75rem 1rem;
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ border-bottom: 1px solid var(--border);
+ font-weight: 500;
+}
+
+td {
+ padding: 0.65rem 1rem;
+ border-bottom: 1px solid var(--border-soft);
+ color: #c0c0bc;
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tr:hover td {
+ background: var(--border-soft);
+}
+
+/* ─── Inline Code ───────────────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.83rem;
+ background: var(--surface-2);
+ color: var(--accent);
+ padding: 0.18rem 0.4rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ word-break: break-word;
+}
+
+/* ─── Code Blocks ───────────────────────────────────────── */
+pre {
+ background: var(--surface);
+ border: 1px solid var(--border);
+ border-left: 2px solid var(--accent);
+ padding: 1.4rem 1.6rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.6rem;
+ right: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: #d0d0cc;
+ font-size: 0.87rem;
+ line-height: 1.65;
+}
+
+/* ─── Images ────────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ margin: 2rem auto;
+}
+
+figure {
+ margin: 2.5rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ color: var(--text-dim);
+ text-align: center;
+ margin-top: 0.75rem;
+ letter-spacing: 0.04em;
+}
+
+/* ─── Footnotes / Aside ─────────────────────────────────── */
+aside,
+.note,
+.callout {
+ background: var(--accent-dim);
+ border: 1px solid rgba(200, 242, 58, 0.2);
+ border-radius: var(--radius);
+ padding: 1rem 1.2rem;
+ margin: 2rem 0;
+ font-size: 0.88rem;
+ color: #c0c0bc;
+}
+
+aside strong,
+.callout strong {
+ color: var(--accent);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ display: block;
+ margin-left: 3px;
+ margin-bottom: 0.4rem;
+}
+
+/* ─── Tags / Badges ─────────────────────────────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 0.25rem 0.6rem;
+ border: 1px solid var(--border);
+ border-radius: 2px;
+ color: var(--text-dim);
+ margin-right: 0.4rem;
+ text-decoration: none;
+ border-bottom: none;
+ transition: all var(--transition);
+}
+
+.tag:hover {
+ border-color: var(--accent);
+ color: var(--accent);
+ background: var(--accent-dim);
+}
+
+/* ─── Navigation ───────────────────────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.2rem 0 3rem;
+ border-bottom: 1px solid var(--border);
+ margin-bottom: 3.5rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 800;
+ font-size: 1.1rem;
+ letter-spacing: -0.02em;
+ color: var(--text);
+ border-bottom: none;
+}
+
+nav .logo span {
+ color: var(--accent);
+}
+
+nav ul {
+ display: flex;
+ gap: 2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ border-bottom: none;
+ transition: color var(--transition);
+}
+
+nav a:hover {
+ color: var(--accent);
+ border-bottom: none;
+}
+
+/* ─── Footer ───────────────────────────────────────────── */
+footer {
+ margin-top: 5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.05em;
+ color: var(--text-muted);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+/* ─── Reading Progress Bar ─────────────────────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: var(--accent);
+ z-index: 999;
+ transform-origin: left;
+ width: 0%;
+ box-shadow: 0 0 8px var(--accent-glow);
+ transition: width 0.1s linear;
+}
+
+/* ─── Selection ────────────────────────────────────────── */
+::selection {
+ background: rgba(200, 242, 58, 0.2);
+ color: var(--text);
+}
+
+/* ─── Scrollbar ────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--border);
+ border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--text-muted);
+}
+
+/* ─── Abbr ─────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dotted var(--text-dim);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ───────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.2rem 4rem;
+ font-size: 17px;
+ }
+
+ h1 {
+ font-size: 2rem;
+ }
+ h2 {
+ font-size: 1.35rem;
+ }
+
+ nav ul {
+ gap: 1.2rem;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 1rem;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+/* ─── Focus Accessibility ──────────────────────────────── */
+:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/modern-light.css b/themes/modern-light.css
new file mode 100644
index 0000000..0423a58
--- /dev/null
+++ b/themes/modern-light.css
@@ -0,0 +1,492 @@
+@import url("https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400;0,500;1,400;1,500&family=Epilogue:wght@400;500;600;700;800&family=IBM+Plex+Mono:wght@400;500&display=swap");
+
+/* ─── Design Tokens ─────────────────────────────────────── */
+:root {
+ --bg: #fafaf8;
+ --bg-subtle: #f4f4f1;
+ --surface: #ffffff;
+ --border: #e8e8e3;
+ --border-soft: rgba(0, 0, 0, 0.06);
+ --text: #1a1a18;
+ --text-dim: #6b6b66;
+ --text-muted: #b0b0aa;
+ --accent: #1a1a18; /* ink — no color accent, just weight */
+ --accent-warm: #c85a2a; /* terracotta for single-use sparingly */
+ --serif: "Lora", Georgia, serif;
+ --sans: "Epilogue", system-ui, sans-serif;
+ --mono: "IBM Plex Mono", ui-monospace, monospace;
+ --radius: 3px;
+ --max-w: 740px;
+ --transition: 140ms ease;
+}
+
+/* ─── Reset & Base ──────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ margin: 0;
+ padding: 3.5rem 2rem 6rem;
+ background: var(--bg);
+ color: var(--text);
+ font-family: var(--serif);
+ line-height: 1.82;
+ font-size: 19px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--sans);
+ font-weight: 700;
+ line-height: 1.18;
+ letter-spacing: -0.025em;
+ scroll-margin-top: 1.5rem;
+ color: var(--text);
+}
+
+h1 {
+ font-size: clamp(2rem, 5vw, 2.75rem);
+ font-weight: 800;
+ margin-top: 0;
+ margin-bottom: 0.6rem;
+}
+
+h2 {
+ font-size: 1.35rem;
+ font-weight: 700;
+ margin-top: 3.5rem;
+ margin-bottom: 0.5rem;
+}
+
+h3 {
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin-top: 2.2rem;
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.3rem 0;
+ color: #2c2c28;
+}
+
+/* First paragraph after h1 — slightly larger lead */
+h1 + p,
+header + article > p:first-child {
+ font-size: 1.08rem;
+ color: #3a3a36;
+ line-height: 1.85;
+}
+
+/* ─── Article Meta ──────────────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-family: var(--mono);
+ font-size: 0.72rem;
+ letter-spacing: 0.07em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+ margin-bottom: 2.8rem;
+}
+
+/* ─── Links ─────────────────────────────────────────────── */
+a {
+ color: inherit;
+ text-decoration-line: underline;
+ text-decoration-color: var(--border);
+ text-underline-offset: 3px;
+ text-decoration-thickness: 1px;
+ transition:
+ text-decoration-color var(--transition),
+ color var(--transition);
+}
+
+a:hover {
+ text-decoration-color: var(--text);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.3rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.4rem;
+ margin: 0.5rem 0;
+ color: #2c2c28;
+}
+
+ul li::before {
+ content: "—";
+ position: absolute;
+ left: 0;
+ color: var(--text-muted);
+ font-family: var(--sans);
+ font-weight: 400;
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+
+ol li {
+ counter-increment: ol-counter;
+}
+
+ol li::before {
+ content: counter(ol-counter);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--text-muted);
+ top: 0.3em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 3.5rem auto;
+ width: 3rem;
+ height: 1px;
+ background: var(--text);
+ opacity: 0.2;
+}
+
+/* ─── Blockquote ────────────────────────────────────────── */
+blockquote {
+ margin: 2.5rem 0;
+ padding: 0 0 0 1.6rem;
+ border-left: 2px solid var(--text);
+ position: relative;
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.05rem;
+ line-height: 1.72;
+ color: #3a3a36;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.05em;
+ color: var(--text-muted);
+ font-style: normal;
+}
+
+/* ─── Tables ────────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2rem 0;
+ font-size: 0.88rem;
+ font-family: var(--mono);
+}
+
+thead tr {
+ border-bottom: 2px solid var(--text);
+}
+
+th {
+ text-align: left;
+ padding: 0.5rem 0.8rem 0.6rem 0;
+ font-size: 0.68rem;
+ letter-spacing: 0.09em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ font-weight: 500;
+}
+
+td {
+ padding: 0.55rem 0.8rem 0.55rem 0;
+ border-bottom: 1px solid var(--border);
+ color: #2c2c28;
+ vertical-align: top;
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+/* ─── Inline Code ───────────────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.82rem;
+ background: var(--bg-subtle);
+ padding: 0.18rem 0.38rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ color: var(--accent-warm);
+ word-break: break-word;
+}
+
+/* ─── Code Blocks ───────────────────────────────────────── */
+pre {
+ background: var(--bg-subtle);
+ border: 1px solid var(--border);
+ padding: 1.3rem 1.5rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.6rem;
+ right: 0.8rem;
+ font-family: var(--mono);
+ font-size: 0.62rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: #2c2c28;
+ font-size: 0.85rem;
+ line-height: 1.7;
+}
+
+/* ─── Images ────────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ margin: 2.5rem auto;
+ border-radius: var(--radius);
+}
+
+figure {
+ margin: 2.5rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--text-muted);
+ text-align: center;
+ margin-top: 0.65rem;
+ letter-spacing: 0.04em;
+}
+
+/* ─── Aside / Callout ───────────────────────────────────── */
+aside,
+.note,
+.callout {
+ background: var(--bg-subtle);
+ border: 1px solid var(--border);
+ border-radius: var(--radius);
+ padding: 1rem 1.2rem;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ color: var(--text-dim);
+}
+
+aside strong,
+.callout strong {
+ font-family: var(--mono);
+ font-size: 0.67rem;
+ letter-spacing: 0.09em;
+ text-transform: uppercase;
+ color: var(--text);
+ display: block;
+ margin-bottom: 0.35rem;
+}
+
+/* ─── Tags ───────────────────────────────────────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ padding: 0.22rem 0.55rem;
+ border: 1px solid var(--border);
+ border-radius: 2px;
+ color: var(--text-dim);
+ margin-right: 0.35rem;
+ text-decoration: none;
+ transition: all var(--transition);
+}
+
+.tag:hover {
+ background: var(--text);
+ color: var(--bg);
+ border-color: var(--text);
+}
+
+/* ─── Navigation ─────────────────────────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 0 3rem;
+ border-bottom: 1px solid var(--border);
+ margin-bottom: 3.5rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 800;
+ font-size: 1rem;
+ letter-spacing: -0.02em;
+ color: var(--text);
+ text-decoration: none;
+}
+
+nav ul {
+ display: flex;
+ gap: 2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.07em;
+ text-transform: uppercase;
+ color: var(--text-muted);
+ text-decoration: none;
+ transition: color var(--transition);
+}
+
+nav a:hover {
+ color: var(--text);
+}
+
+/* ─── Footer ─────────────────────────────────────────────── */
+footer {
+ margin-top: 5rem;
+ padding-top: 2rem;
+ border-top: 1px solid var(--border);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.04em;
+ color: var(--text-muted);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+/* ─── Reading Progress ───────────────────────────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 1px;
+ background: var(--text);
+ z-index: 999;
+ width: 0%;
+ transition: width 0.1s linear;
+}
+
+/* ─── Selection ──────────────────────────────────────────── */
+::selection {
+ background: #e8e8c8;
+ color: var(--text);
+}
+
+/* ─── Scrollbar ──────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 5px;
+ height: 5px;
+}
+::-webkit-scrollbar-track {
+ background: var(--bg);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--border);
+ border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--text-muted);
+}
+
+/* ─── Abbr ───────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dotted var(--text-muted);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ─────────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.3rem 4rem;
+ font-size: 17px;
+ }
+
+ h1 {
+ font-size: 1.85rem;
+ }
+ h2 {
+ font-size: 1.2rem;
+ }
+
+ nav ul {
+ gap: 1.2rem;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 0.8rem;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+/* ─── Focus Accessibility ─────────────────────────────────── */
+:focus-visible {
+ outline: 2px solid var(--text);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/rose-pine.css b/themes/rose-pine.css
new file mode 100644
index 0000000..83b1214
--- /dev/null
+++ b/themes/rose-pine.css
@@ -0,0 +1,1438 @@
+@import url("https://fonts.googleapis.com/css2?family=Zodiak:ital,wght@0,400;0,500;0,700;1,400;1,500&family=Cabinet+Grotesk:wght@400;500;700;800&family=Commit+Mono:ital,wght@0,400;0,700;1,400&display=swap");
+/* Fallback if variable fonts aren't available via Google */
+@import url("https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,700;1,400;1,500&family=Outfit:wght@400;500;700;800&family=JetBrains+Mono:ital,wght@0,400;0,500;0,700;1,400&display=swap");
+
+/* ═══════════════════════════════════════════════════════════
+ ROSÉ PINE — Full Palette
+ ═══════════════════════════════════════════════════════════ */
+:root {
+ /* Base */
+ --rp-base: #191724;
+ --rp-surface: #1f1d2e;
+ --rp-overlay: #26233a;
+
+ /* Muted / subtle */
+ --rp-muted: #6e6a86;
+ --rp-subtle: #908caa;
+ --rp-text: #e0def4;
+
+ /* Accent spectrum */
+ --rp-love: #eb6f92; /* pink-red */
+ --rp-gold: #f6c177; /* warm gold */
+ --rp-rose: #ebbcba; /* soft rose */
+ --rp-pine: #31748f; /* teal-blue */
+ --rp-foam: #9ccfd8; /* pale cyan */
+ --rp-iris: #c4a7e7; /* lavender */
+ --rp-highlight-low: #21202e;
+ --rp-highlight-med: #403d52;
+ --rp-highlight-high: #524f67;
+
+ /* Semantic */
+ --bg: var(--rp-base);
+ --surface: var(--rp-surface);
+ --surface-2: var(--rp-overlay);
+ --border: var(--rp-highlight-med);
+ --border-soft: rgba(196, 167, 231, 0.08);
+ --text: var(--rp-text);
+ --text-dim: var(--rp-subtle);
+ --text-muted: var(--rp-muted);
+ --accent: var(--rp-iris);
+ --accent-2: var(--rp-foam);
+
+ /* Fonts */
+ --serif: "Zodiak", "Playfair Display", Georgia, serif;
+ --sans: "Cabinet Grotesk", "Outfit", system-ui, sans-serif;
+ --mono: "Commit Mono", "JetBrains Mono", ui-monospace, monospace;
+
+ --radius: 6px;
+ --max-w: 740px;
+ --transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);
+ --spring: 400ms cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ RESET
+ ═══════════════════════════════════════════════════════════ */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+html {
+ scroll-behavior: smooth;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ PAGE LOAD — staggered fade-up animation
+ ═══════════════════════════════════════════════════════════ */
+@keyframes fadeUp {
+ from {
+ opacity: 0;
+ transform: translateY(18px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes shimmer {
+ 0% {
+ background-position: -200% center;
+ }
+ 100% {
+ background-position: 200% center;
+ }
+}
+
+@keyframes blink {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+}
+
+@keyframes progressPulse {
+ 0% {
+ box-shadow: 0 0 6px rgba(196, 167, 231, 0.4);
+ }
+ 50% {
+ box-shadow: 0 0 14px rgba(235, 111, 146, 0.6);
+ }
+ 100% {
+ box-shadow: 0 0 6px rgba(196, 167, 231, 0.4);
+ }
+}
+
+@keyframes borderGlow {
+ 0% {
+ border-color: var(--rp-iris);
+ }
+ 33% {
+ border-color: var(--rp-foam);
+ }
+ 66% {
+ border-color: var(--rp-rose);
+ }
+ 100% {
+ border-color: var(--rp-iris);
+ }
+}
+
+nav {
+ animation: fadeIn 0.5s ease both;
+}
+header {
+ animation: fadeUp 0.55s ease 0.1s both;
+}
+article > *:nth-child(1) {
+ animation: fadeUp 0.5s ease 0.15s both;
+}
+article > *:nth-child(2) {
+ animation: fadeUp 0.5s ease 0.2s both;
+}
+article > *:nth-child(3) {
+ animation: fadeUp 0.5s ease 0.25s both;
+}
+article > *:nth-child(4) {
+ animation: fadeUp 0.5s ease 0.3s both;
+}
+article > *:nth-child(5) {
+ animation: fadeUp 0.5s ease 0.32s both;
+}
+article > *:nth-child(n + 6) {
+ animation: fadeUp 0.5s ease 0.34s both;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ BODY
+ ═══════════════════════════════════════════════════════════ */
+body {
+ margin: 0;
+ padding: 3.5rem 2rem 7rem;
+ background-color: var(--rp-base);
+ background-image:
+ /* Soft iris radial bloom at top */
+ radial-gradient(
+ ellipse 70% 45% at 50% -10%,
+ rgba(196, 167, 231, 0.09) 0%,
+ transparent 65%
+ ),
+ /* Love pink whisper bottom-right */
+ radial-gradient(
+ ellipse 50% 40% at 90% 110%,
+ rgba(235, 111, 146, 0.05) 0%,
+ transparent 55%
+ ),
+ /* Grain texture */
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
+ color: var(--rp-text);
+ font-family: var(--serif);
+ line-height: 1.85;
+ font-size: 18.5px;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ HEADINGS
+ ═══════════════════════════════════════════════════════════ */
+h1,
+h2,
+h3,
+h4,
+h5 {
+ font-family: var(--sans);
+ line-height: 1.18;
+ letter-spacing: -0.022em;
+ scroll-margin-top: 2rem;
+}
+
+/* h1 — iris → love shimmer gradient */
+h1 {
+ font-size: clamp(2rem, 5.5vw, 3.1rem);
+ font-weight: 800;
+ margin-bottom: 0.4rem;
+ background: linear-gradient(
+ 120deg,
+ var(--rp-text) 0%,
+ var(--rp-iris) 40%,
+ var(--rp-love) 70%,
+ var(--rp-rose) 100%
+ );
+ background-size: 200% auto;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ animation: shimmer 6s linear infinite;
+}
+
+/* h2 — foam */
+h2 {
+ font-size: 1.45rem;
+ font-weight: 700;
+ margin-top: 3.5rem;
+ color: var(--rp-foam);
+ padding-bottom: 0.55rem;
+ border-bottom: 1px solid var(--rp-highlight-med);
+ position: relative;
+}
+
+/* h2 left indicator dot */
+h2::before {
+ content: "";
+ position: absolute;
+ left: -1.1rem;
+ top: 50%;
+ transform: translateY(-60%);
+ width: 5px;
+ height: 5px;
+ border-radius: 50%;
+ background: var(--rp-foam);
+ opacity: 0.7;
+}
+
+/* h3 — gold */
+h3 {
+ font-size: 1.15rem;
+ font-weight: 700;
+ margin-top: 2.2rem;
+ color: var(--rp-gold);
+}
+
+/* h4 — rose */
+h4 {
+ font-size: 1rem;
+ font-weight: 700;
+ margin-top: 1.8rem;
+ color: var(--rp-rose);
+}
+
+/* h5 — love, uppercase label */
+h5 {
+ font-size: 0.72rem;
+ font-weight: 700;
+ margin-top: 1.5rem;
+ color: var(--rp-love);
+ text-transform: uppercase;
+ letter-spacing: 0.12em;
+ font-family: var(--mono);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ PARAGRAPHS & DROP CAPS
+ ═══════════════════════════════════════════════════════════ */
+p {
+ margin: 1.4rem 0;
+ color: #cac9e0;
+ font-size: 1rem;
+ line-height: 1.88;
+}
+
+/* Drop cap — first paragraph after h1 */
+h1 + p::first-letter,
+header + article > p:first-child::first-letter,
+.drop-cap::first-letter {
+ font-family: var(--serif);
+ font-size: 4.2rem;
+ font-weight: 700;
+ font-style: italic;
+ float: left;
+ line-height: 0.78;
+ margin: 0.1em 0.12em -0.05em 0;
+ color: var(--rp-iris);
+ /* Faint text shadow bloom */
+ text-shadow: 0 0 30px rgba(196, 167, 231, 0.35);
+ /* Animated colour cycle */
+ animation: borderGlow 8s ease infinite;
+ -webkit-text-fill-color: var(--rp-iris);
+}
+
+/* Drop cap after every major h2 section (opt-in) */
+h2 + p::first-letter {
+ font-family: var(--serif);
+ font-size: 2.6rem;
+ font-weight: 700;
+ font-style: italic;
+ float: left;
+ line-height: 0.82;
+ margin: 0.08em 0.1em 0 0;
+ color: var(--rp-foam);
+ -webkit-text-fill-color: var(--rp-foam);
+}
+
+/* Lead paragraph */
+h1 + p {
+ font-size: 1.08rem;
+ color: var(--rp-subtle);
+ line-height: 1.92;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ META / BYLINE
+ ═══════════════════════════════════════════════════════════ */
+.meta,
+time,
+.byline {
+ display: flex;
+ align-items: center;
+ gap: 0.8rem;
+ flex-wrap: wrap;
+ font-family: var(--mono);
+ font-size: 0.73rem;
+ letter-spacing: 0.06em;
+ color: var(--rp-muted);
+ margin-bottom: 2.8rem;
+ margin-top: 0.3rem;
+}
+
+.meta::before,
+time::before {
+ content: "◆";
+ color: var(--rp-love);
+ font-size: 0.45rem;
+ animation: blink 3s ease-in-out infinite;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ LINKS
+ ═══════════════════════════════════════════════════════════ */
+a {
+ color: var(--rp-foam);
+ text-decoration: none;
+ border-bottom: 1px solid rgba(156, 207, 216, 0.3);
+ transition:
+ color var(--transition),
+ border-color var(--transition);
+ position: relative;
+}
+
+a:hover {
+ color: var(--rp-iris);
+ border-bottom-color: var(--rp-iris);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ LISTS
+ ═══════════════════════════════════════════════════════════ */
+ul,
+ol {
+ margin: 1.4rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 1.7rem;
+ margin: 0.55rem 0;
+ color: #cac9e0;
+ line-height: 1.78;
+}
+
+/* ul — iris diamond */
+ul li::before {
+ content: "◇";
+ position: absolute;
+ left: 0;
+ top: 0.05em;
+ color: var(--rp-iris);
+ font-size: 0.8rem;
+ transition:
+ color var(--transition),
+ transform var(--spring);
+}
+
+ul li:hover::before {
+ color: var(--rp-love);
+ transform: rotate(45deg) scale(1.2);
+}
+
+/* ol — love numbered */
+ol {
+ counter-reset: ol-counter;
+}
+ol li {
+ counter-increment: ol-counter;
+}
+
+ol li::before {
+ content: counter(ol-counter, decimal-leading-zero);
+ position: absolute;
+ left: 0;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--rp-love);
+ top: 0.3em;
+ transition: color var(--transition);
+}
+
+ol li:hover::before {
+ color: var(--rp-gold);
+}
+
+/* Nested lists */
+ul ul li::before {
+ color: var(--rp-foam);
+ content: "–";
+ top: 0;
+}
+ol ol li::before {
+ color: var(--rp-rose);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ HORIZONTAL RULE
+ ═══════════════════════════════════════════════════════════ */
+hr {
+ border: none;
+ margin: 4rem auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.6rem;
+ position: relative;
+ height: 1rem;
+}
+
+hr::before,
+hr::after {
+ content: "";
+ flex: 1;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, var(--rp-highlight-med));
+}
+
+hr::after {
+ background: linear-gradient(90deg, var(--rp-highlight-med), transparent);
+}
+
+/* Centre ornament via a wrapping trick using outline */
+hr + * {
+ /* nothing needed — ornament is in pseudo */
+}
+
+/* We use a data attribute for ornament text, fallback to ✦ */
+hr[data-ornament]::before {
+ display: none;
+}
+hr[data-ornament]::after {
+ display: none;
+}
+
+/* Default ornament via box-shadow outline */
+.ornament {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.6rem;
+ margin: 4rem 0;
+ color: var(--rp-muted);
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ letter-spacing: 0.3em;
+}
+
+.ornament::before,
+.ornament::after {
+ content: "";
+ flex: 1;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--rp-highlight-med) 50%,
+ transparent
+ );
+}
+
+/* ═══════════════════════════════════════════════════════════
+ BLOCKQUOTE — love/rose palette
+ ═══════════════════════════════════════════════════════════ */
+blockquote {
+ margin: 2.8rem 0;
+ padding: 1.6rem 1.8rem 1.6rem 2rem;
+ background: var(--rp-surface);
+ border-left: 2px solid var(--rp-love);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ position: relative;
+ transition: border-color var(--transition);
+}
+
+blockquote::before {
+ content: "\201C";
+ font-family: var(--serif);
+ font-size: 5rem;
+ line-height: 1;
+ color: var(--rp-love);
+ opacity: 0.15;
+ position: absolute;
+ top: -0.5rem;
+ left: 1.2rem;
+ pointer-events: none;
+ transition: opacity var(--transition);
+}
+
+blockquote:hover::before {
+ opacity: 0.28;
+}
+blockquote:hover {
+ border-color: var(--rp-rose);
+}
+
+blockquote p {
+ margin: 0;
+ font-style: italic;
+ font-size: 1.08rem;
+ color: var(--rp-rose);
+ line-height: 1.78;
+ position: relative;
+ z-index: 1;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.9rem;
+ font-family: var(--mono);
+ font-size: 0.71rem;
+ letter-spacing: 0.05em;
+ color: var(--rp-muted);
+ font-style: normal;
+}
+
+blockquote cite::before {
+ content: "— ";
+ color: var(--rp-love);
+}
+
+/* Pull quote variant */
+.pullquote {
+ margin: 3rem -2rem;
+ padding: 2rem 3rem;
+ background: var(--rp-overlay);
+ border: none;
+ border-top: 1px solid var(--rp-highlight-med);
+ border-bottom: 1px solid var(--rp-highlight-med);
+ text-align: center;
+ border-radius: 0;
+}
+
+.pullquote::before {
+ display: none;
+}
+
+.pullquote p {
+ font-size: 1.3rem;
+ color: var(--rp-iris);
+ font-style: italic;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ TABLES
+ ═══════════════════════════════════════════════════════════ */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 2.2rem 0;
+ font-size: 0.88rem;
+ font-family: var(--mono);
+ background: var(--rp-surface);
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--rp-highlight-med);
+}
+
+thead {
+ background: var(--rp-overlay);
+}
+
+th {
+ text-align: left;
+ padding: 0.75rem 1.1rem;
+ font-size: 0.68rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--rp-iris);
+ border-bottom: 1px solid var(--rp-highlight-med);
+ font-weight: 600;
+}
+
+td {
+ padding: 0.65rem 1.1rem;
+ border-bottom: 1px solid rgba(64, 61, 82, 0.5);
+ color: var(--rp-subtle);
+ transition:
+ color var(--transition),
+ background var(--transition);
+ vertical-align: top;
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tbody tr {
+ transition: background var(--transition);
+}
+
+tbody tr:hover td {
+ background: rgba(196, 167, 231, 0.05);
+ color: var(--rp-text);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ INLINE CODE
+ ═══════════════════════════════════════════════════════════ */
+code {
+ font-family: var(--mono);
+ font-size: 0.82rem;
+ background: var(--rp-overlay);
+ color: var(--rp-gold);
+ padding: 0.16rem 0.42rem;
+ border-radius: 4px;
+ border: 1px solid var(--rp-highlight-med);
+ word-break: break-word;
+ transition:
+ background var(--transition),
+ color var(--transition);
+}
+
+code:hover {
+ background: var(--rp-highlight-med);
+ color: var(--rp-iris);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ CODE BLOCKS — terminal styled
+ ═══════════════════════════════════════════════════════════ */
+.code-wrap {
+ margin: 2.2rem 0;
+ border-radius: var(--radius);
+ overflow: hidden;
+ border: 1px solid var(--rp-highlight-med);
+ transition:
+ border-color var(--transition),
+ box-shadow var(--transition);
+}
+
+.code-wrap:hover {
+ border-color: var(--rp-iris);
+ box-shadow:
+ 0 0 0 1px rgba(196, 167, 231, 0.12),
+ 0 8px 32px rgba(25, 23, 36, 0.5);
+}
+
+/* Terminal titlebar */
+.code-wrap .titlebar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background: var(--rp-overlay);
+ padding: 0.55rem 1rem;
+ border-bottom: 1px solid var(--rp-highlight-med);
+}
+
+.code-wrap .titlebar .dots {
+ display: flex;
+ gap: 6px;
+ align-items: center;
+}
+
+.code-wrap .titlebar .dot {
+ width: 11px;
+ height: 11px;
+ border-radius: 50%;
+ transition: opacity var(--transition);
+}
+
+.code-wrap .titlebar .dot-close {
+ background: var(--rp-love);
+}
+.code-wrap .titlebar .dot-min {
+ background: var(--rp-gold);
+}
+.code-wrap .titlebar .dot-max {
+ background: var(--rp-foam);
+}
+
+.code-wrap:not(:hover) .titlebar .dot {
+ opacity: 0.5;
+}
+
+.code-wrap .titlebar .lang-label {
+ font-family: var(--mono);
+ font-size: 0.67rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--rp-muted);
+}
+
+.code-wrap .titlebar .copy-btn {
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--rp-muted);
+ background: none;
+ border: 1px solid var(--rp-highlight-med);
+ border-radius: 3px;
+ padding: 0.15rem 0.5rem;
+ cursor: pointer;
+ transition: all var(--transition);
+}
+
+.code-wrap .titlebar .copy-btn:hover {
+ color: var(--rp-iris);
+ border-color: var(--rp-iris);
+ background: rgba(196, 167, 231, 0.08);
+}
+
+.code-wrap .titlebar .copy-btn.copied {
+ color: var(--rp-foam);
+ border-color: var(--rp-foam);
+}
+
+/* Prompt bar */
+.code-wrap .prompt-bar {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ background: var(--rp-surface);
+ padding: 0.4rem 1rem;
+ border-bottom: 1px solid var(--rp-highlight-low);
+ font-family: var(--mono);
+ font-size: 0.72rem;
+}
+
+.prompt-bar .ps-user {
+ color: var(--rp-foam);
+}
+.prompt-bar .ps-at {
+ color: var(--rp-muted);
+}
+.prompt-bar .ps-host {
+ color: var(--rp-iris);
+}
+.prompt-bar .ps-colon {
+ color: var(--rp-muted);
+}
+.prompt-bar .ps-path {
+ color: var(--rp-gold);
+}
+.prompt-bar .ps-sign {
+ color: var(--rp-love);
+ margin-left: 2px;
+}
+.prompt-bar .ps-cmd {
+ color: var(--rp-text);
+ margin-left: 4px;
+}
+
+.code-wrap pre {
+ margin: 0;
+ border: none;
+ border-radius: 0;
+ background: var(--rp-base);
+ padding: 1.2rem 1.4rem;
+ overflow-x: auto;
+ position: relative;
+}
+
+.code-wrap pre::before {
+ display: none;
+} /* override any global pre::before */
+
+.code-wrap pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: var(--rp-text);
+ font-size: 0.86rem;
+ line-height: 1.7;
+ font-family: var(--mono);
+}
+
+.code-wrap pre code:hover {
+ background: none;
+ color: var(--rp-text);
+}
+
+/* Rosé Pine syntax classes */
+.code-wrap .kw {
+ color: var(--rp-love);
+}
+.code-wrap .fn {
+ color: var(--rp-gold);
+}
+.code-wrap .str {
+ color: var(--rp-foam);
+}
+.code-wrap .num {
+ color: var(--rp-iris);
+}
+.code-wrap .cm {
+ color: var(--rp-muted);
+ font-style: italic;
+}
+.code-wrap .kv {
+ color: var(--rp-rose);
+}
+.code-wrap .type {
+ color: var(--rp-gold);
+}
+.code-wrap .op {
+ color: var(--rp-subtle);
+}
+
+/* Fallback bare pre (without .code-wrap) */
+pre {
+ background: var(--rp-surface);
+ border: 1px solid var(--rp-highlight-med);
+ border-left: 2px solid var(--rp-iris);
+ padding: 1.3rem 1.5rem;
+ overflow-x: auto;
+ border-radius: var(--radius);
+ margin: 2rem 0;
+ position: relative;
+}
+
+pre::before {
+ content: attr(data-lang);
+ position: absolute;
+ top: 0.6rem;
+ right: 0.9rem;
+ font-family: var(--mono);
+ font-size: 0.62rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--rp-muted);
+}
+
+pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: var(--rp-text);
+ font-size: 0.87rem;
+ line-height: 1.68;
+}
+
+pre code:hover {
+ background: none;
+ color: var(--rp-text);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ IMAGES & FIGURES
+ ═══════════════════════════════════════════════════════════ */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--rp-highlight-med);
+ margin: 2.5rem auto;
+ transition:
+ border-color var(--transition),
+ box-shadow var(--transition);
+}
+
+img:hover {
+ border-color: var(--rp-iris);
+ box-shadow:
+ 0 0 0 2px rgba(196, 167, 231, 0.1),
+ 0 12px 40px rgba(25, 23, 36, 0.6);
+}
+
+figure {
+ margin: 2.8rem 0;
+}
+
+figcaption {
+ font-family: var(--mono);
+ font-size: 0.71rem;
+ color: var(--rp-muted);
+ text-align: center;
+ margin-top: 0.75rem;
+ letter-spacing: 0.04em;
+}
+
+figcaption::before {
+ content: "fig. ";
+ color: var(--rp-love);
+ font-style: italic;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ CALLOUTS — full palette coverage
+ ═══════════════════════════════════════════════════════════ */
+.callout {
+ background: var(--rp-surface);
+ border: 1px solid var(--rp-highlight-med);
+ border-left: 3px solid var(--rp-iris);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ padding: 1.1rem 1.3rem;
+ margin: 2rem 0;
+ font-size: 0.9rem;
+ color: var(--rp-subtle);
+ transition:
+ border-color var(--transition),
+ background var(--transition);
+ position: relative;
+}
+
+.callout:hover {
+ background: var(--rp-overlay);
+}
+
+.callout strong {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ font-family: var(--mono);
+ font-size: 0.68rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--rp-iris);
+ margin-bottom: 0.45rem;
+}
+
+/* Variants */
+.callout.love {
+ border-left-color: var(--rp-love);
+}
+.callout.love strong {
+ color: var(--rp-love);
+}
+.callout.love strong::before {
+ content: "✕";
+}
+
+.callout.gold {
+ border-left-color: var(--rp-gold);
+}
+.callout.gold strong {
+ color: var(--rp-gold);
+}
+.callout.gold strong::before {
+ content: "⚠";
+ font-style: normal;
+}
+
+.callout.pine {
+ border-left-color: var(--rp-pine);
+}
+.callout.pine strong {
+ color: var(--rp-pine);
+}
+.callout.pine strong::before {
+ content: "→";
+}
+
+.callout.foam {
+ border-left-color: var(--rp-foam);
+}
+.callout.foam strong {
+ color: var(--rp-foam);
+}
+.callout.foam strong::before {
+ content: "ℹ";
+}
+
+.callout.rose {
+ border-left-color: var(--rp-rose);
+}
+.callout.rose strong {
+ color: var(--rp-rose);
+}
+.callout.rose strong::before {
+ content: "◆";
+ font-size: 0.5em;
+}
+
+.callout strong::before {
+ content: "◆";
+ font-size: 0.5em;
+ opacity: 0.7;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ TAGS / BADGES
+ ═══════════════════════════════════════════════════════════ */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ letter-spacing: 0.09em;
+ text-transform: uppercase;
+ padding: 0.22rem 0.62rem;
+ border: 1px solid var(--rp-highlight-med);
+ border-radius: 100px;
+ color: var(--rp-muted);
+ margin-right: 0.4rem;
+ text-decoration: none;
+ border-bottom: 1px solid var(--rp-highlight-med);
+ transition: all var(--transition);
+ position: relative;
+ overflow: hidden;
+}
+
+.tag::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: var(--rp-iris);
+ opacity: 0;
+ transition: opacity var(--transition);
+ border-radius: inherit;
+}
+
+.tag:hover {
+ border-color: var(--rp-iris);
+ color: var(--rp-iris);
+ transform: translateY(-1px);
+ box-shadow: 0 3px 10px rgba(196, 167, 231, 0.15);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ KEYBOARD SHORTCUT / KBD
+ ═══════════════════════════════════════════════════════════ */
+kbd {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.78rem;
+ background: var(--rp-overlay);
+ color: var(--rp-text);
+ padding: 0.15rem 0.5rem;
+ border-radius: 4px;
+ border: 1px solid var(--rp-highlight-high);
+ border-bottom-width: 2px;
+ line-height: 1.5;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ DEFINITION LIST
+ ═══════════════════════════════════════════════════════════ */
+dl {
+ margin: 1.6rem 0;
+}
+
+dt {
+ font-family: var(--sans);
+ font-weight: 700;
+ color: var(--rp-gold);
+ margin-top: 1rem;
+ font-size: 0.95rem;
+}
+
+dt::after {
+ content: ":";
+ color: var(--rp-muted);
+}
+
+dd {
+ margin: 0.3rem 0 0 1.4rem;
+ color: var(--rp-subtle);
+ font-size: 0.93rem;
+ border-left: 2px solid var(--rp-highlight-med);
+ padding-left: 0.9rem;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ FOOTNOTES
+ ═══════════════════════════════════════════════════════════ */
+.footnotes {
+ margin-top: 4rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid var(--rp-highlight-med);
+ font-family: var(--mono);
+ font-size: 0.78rem;
+ color: var(--rp-muted);
+ counter-reset: fn;
+}
+
+.footnotes p {
+ font-size: 0.78rem;
+ color: var(--rp-muted);
+ margin: 0.4rem 0;
+ padding-left: 1.6rem;
+ position: relative;
+}
+
+sup {
+ font-family: var(--mono);
+ font-size: 0.65rem;
+ color: var(--rp-love);
+ margin-left: 1px;
+ vertical-align: super;
+ line-height: 0;
+}
+
+a[id^="fn-"] {
+ color: var(--rp-love);
+ border-bottom: none;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ NAVIGATION — pine/iris
+ ═══════════════════════════════════════════════════════════ */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1rem 0 3rem;
+ border-bottom: 1px solid var(--rp-highlight-med);
+ margin-bottom: 3.5rem;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+nav .logo {
+ font-family: var(--sans);
+ font-weight: 800;
+ font-size: 1.05rem;
+ letter-spacing: -0.025em;
+ color: var(--rp-text);
+ text-decoration: none;
+ border-bottom: none;
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ transition: color var(--transition);
+}
+
+nav .logo::before {
+ content: "✿";
+ color: var(--rp-love);
+ font-size: 0.9rem;
+ animation: blink 4s ease-in-out infinite;
+}
+
+nav .logo:hover {
+ color: var(--rp-iris);
+}
+nav .logo:hover::before {
+ color: var(--rp-rose);
+}
+
+nav ul {
+ display: flex;
+ gap: 0.3rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.71rem;
+ letter-spacing: 0.07em;
+ text-transform: uppercase;
+ color: var(--rp-muted);
+ text-decoration: none;
+ border-bottom: none;
+ padding: 0.3rem 0.7rem;
+ border-radius: var(--radius);
+ transition: all var(--transition);
+}
+
+nav a:hover {
+ color: var(--rp-iris);
+ background: rgba(196, 167, 231, 0.08);
+ border-bottom: none;
+}
+
+nav a.active {
+ color: var(--rp-iris);
+ background: rgba(196, 167, 231, 0.1);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ ARTICLE HEADER DECORATION
+ ═══════════════════════════════════════════════════════════ */
+header {
+ position: relative;
+ padding-bottom: 2.5rem;
+ border-bottom: 1px solid var(--rp-highlight-med);
+ margin-bottom: 3rem;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ FOOTER
+ ═══════════════════════════════════════════════════════════ */
+footer {
+ margin-top: 6rem;
+ padding: 2rem 0 1rem;
+ border-top: 1px solid var(--rp-highlight-med);
+ font-family: var(--mono);
+ font-size: 0.71rem;
+ letter-spacing: 0.04em;
+ color: var(--rp-muted);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+footer a {
+ color: var(--rp-muted);
+ border-bottom: none;
+ transition: color var(--transition);
+}
+
+footer a:hover {
+ color: var(--rp-iris);
+}
+
+.footer-left::before {
+ content: "✿ ";
+ color: var(--rp-love);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ READING PROGRESS — iris → love → gold
+ ═══════════════════════════════════════════════════════════ */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: linear-gradient(
+ 90deg,
+ var(--rp-iris),
+ var(--rp-love),
+ var(--rp-gold)
+ );
+ z-index: 999;
+ width: 0%;
+ animation: progressPulse 3s ease infinite;
+ transition: width 0.08s linear;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ BLINKING CURSOR
+ ═══════════════════════════════════════════════════════════ */
+.cursor::after {
+ content: "▍";
+ color: var(--rp-iris);
+ animation: blink 1.1s step-end infinite;
+ margin-left: 2px;
+ font-size: 0.85em;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ TABLE OF CONTENTS
+ ═══════════════════════════════════════════════════════════ */
+.toc {
+ background: var(--rp-surface);
+ border: 1px solid var(--rp-highlight-med);
+ border-left: 3px solid var(--rp-pine);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ padding: 1.2rem 1.4rem;
+ margin: 2.5rem 0;
+ font-size: 0.88rem;
+}
+
+.toc-title {
+ font-family: var(--mono);
+ font-size: 0.68rem;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--rp-pine);
+ margin-bottom: 0.9rem;
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+}
+
+.toc-title::before {
+ content: "≡";
+ font-size: 1rem;
+ line-height: 1;
+}
+
+.toc ol {
+ margin: 0;
+ counter-reset: toc-counter;
+}
+
+.toc ol li {
+ counter-increment: toc-counter;
+ padding-left: 1.4rem;
+ margin: 0.3rem 0;
+ color: var(--rp-subtle);
+ font-size: 0.88rem;
+}
+
+.toc ol li::before {
+ content: counter(toc-counter) ".";
+ color: var(--rp-pine);
+ font-size: 0.75rem;
+ top: 0.2em;
+}
+
+.toc a {
+ color: var(--rp-subtle);
+ border-bottom: none;
+ transition: color var(--transition);
+}
+
+.toc a:hover {
+ color: var(--rp-foam);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ SELECTION & SCROLLBAR
+ ═══════════════════════════════════════════════════════════ */
+::selection {
+ background: rgba(196, 167, 231, 0.22);
+ color: var(--rp-text);
+}
+
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+::-webkit-scrollbar-track {
+ background: var(--rp-base);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--rp-highlight-med);
+ border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--rp-highlight-high);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ ABBR
+ ═══════════════════════════════════════════════════════════ */
+abbr[title] {
+ border-bottom: 1px dotted var(--rp-muted);
+ cursor: help;
+ text-decoration: none;
+ color: var(--rp-rose);
+}
+
+/* ═══════════════════════════════════════════════════════════
+ MARK / HIGHLIGHT
+ ═══════════════════════════════════════════════════════════ */
+mark {
+ background: rgba(246, 193, 119, 0.2);
+ color: var(--rp-gold);
+ border-radius: 2px;
+ padding: 0.05em 0.2em;
+}
+
+/* ═══════════════════════════════════════════════════════════
+ RESPONSIVE
+ ═══════════════════════════════════════════════════════════ */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1.3rem 5rem;
+ font-size: 17px;
+ }
+ h1 {
+ font-size: 1.9rem;
+ }
+ h2 {
+ font-size: 1.25rem;
+ }
+ h2::before {
+ display: none;
+ }
+ nav {
+ flex-wrap: wrap;
+ gap: 0.8rem;
+ }
+ nav ul {
+ gap: 0;
+ }
+ footer {
+ flex-direction: column;
+ text-align: center;
+ }
+ .pullquote {
+ margin: 2rem -1.3rem;
+ padding: 1.5rem;
+ }
+}
+
+/* ═══════════════════════════════════════════════════════════
+ FOCUS ACCESSIBILITY
+ ═══════════════════════════════════════════════════════════ */
+:focus-visible {
+ outline: 2px solid var(--rp-iris);
+ outline-offset: 3px;
+ border-radius: var(--radius);
+}
diff --git a/themes/terminal-gruvbox.css b/themes/terminal-gruvbox.css
new file mode 100644
index 0000000..ab67058
--- /dev/null
+++ b/themes/terminal-gruvbox.css
@@ -0,0 +1,744 @@
+@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400&family=Fira+Code:wght@300;400;500;600;700&display=swap");
+
+/* ─── Gruvbox Dark Palette ──────────────────────────────── */
+:root {
+ /* Gruvbox backgrounds */
+ --gb-bg-hard: #1d2021;
+ --gb-bg: #282828;
+ --gb-bg-soft: #32302f;
+ --gb-bg-1: #3c3836;
+ --gb-bg-2: #504945;
+ --gb-bg-3: #665c54;
+ --gb-bg-4: #7c6f64;
+
+ /* Gruvbox foregrounds */
+ --gb-fg: #ebdbb2;
+ --gb-fg-1: #d5c4a1;
+ --gb-fg-2: #bdae93;
+ --gb-fg-3: #a89984;
+
+ /* Gruvbox accent colors — bright variants */
+ --gb-red: #fb4934;
+ --gb-green: #b8bb26;
+ --gb-yellow: #fabd2f;
+ --gb-blue: #83a598;
+ --gb-purple: #d3869b;
+ --gb-aqua: #8ec07c;
+ --gb-orange: #fe8019;
+
+ /* Gruvbox accent colors — normal variants */
+ --gb-red-n: #cc241d;
+ --gb-green-n: #98971a;
+ --gb-yellow-n: #d79921;
+ --gb-blue-n: #458588;
+ --gb-purple-n: #b16286;
+ --gb-aqua-n: #689d6a;
+ --gb-orange-n: #d65d0e;
+
+ /* Semantic */
+ --bg: var(--gb-bg-hard);
+ --surface: var(--gb-bg);
+ --surface-2: var(--gb-bg-soft);
+ --surface-3: var(--gb-bg-1);
+ --border: var(--gb-bg-2);
+ --text: var(--gb-fg);
+ --text-dim: var(--gb-fg-2);
+ --text-muted: var(--gb-bg-4);
+ --accent: var(--gb-yellow);
+ --accent-2: var(--gb-orange);
+
+ /* All mono — terminal commitment */
+ --mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
+
+ --radius: 2px;
+ --max-w: 740px;
+ --transition: 120ms ease;
+}
+
+/* ─── Reset ─────────────────────────────────────────────── */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+html {
+ scroll-behavior: smooth;
+}
+
+/* ─── Body ──────────────────────────────────────────────── */
+body {
+ margin: 0;
+ padding: 3rem 2rem 6rem;
+ background-color: var(--gb-bg-hard);
+ /* Subtle scanline texture */
+ background-image: repeating-linear-gradient(
+ 0deg,
+ transparent,
+ transparent 2px,
+ rgba(0, 0, 0, 0.08) 2px,
+ rgba(0, 0, 0, 0.08) 4px
+ );
+ color: var(--gb-fg);
+ font-family: var(--mono);
+ font-size: 15px;
+ line-height: 1.75;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-feature-settings:
+ "liga" 1,
+ "calt" 1;
+ cursor: default;
+}
+
+body > * {
+ max-width: var(--max-w);
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* ─── Headings ──────────────────────────────────────────── */
+h1,
+h2,
+h3,
+h4 {
+ font-family: var(--mono);
+ font-weight: 700;
+ line-height: 1.2;
+ letter-spacing: 0;
+}
+
+/* h1 — prompt style: yellow with # sigil */
+h1 {
+ font-size: clamp(1.4rem, 3.5vw, 1.9rem);
+ font-weight: 700;
+ color: var(--gb-yellow);
+ margin-bottom: 0.5rem;
+ position: relative;
+ padding-left: 1.6rem;
+}
+
+h1::before {
+ content: "#";
+ position: absolute;
+ left: 0;
+ color: var(--gb-orange);
+ font-weight: 700;
+}
+
+/* h2 — ## green */
+h2 {
+ font-size: 1.2rem;
+ font-weight: 600;
+ margin-top: 3rem;
+ color: var(--gb-green);
+ padding-left: 1.6rem;
+ position: relative;
+ border: none;
+}
+
+h2::before {
+ content: "##";
+ position: absolute;
+ left: 0;
+ color: var(--gb-bg-4);
+ font-weight: 400;
+ font-size: 0.9em;
+}
+
+/* h3 — ### aqua */
+h3 {
+ font-size: 1.05rem;
+ font-weight: 600;
+ margin-top: 2rem;
+ color: var(--gb-aqua);
+ padding-left: 2.1rem;
+ position: relative;
+}
+
+h3::before {
+ content: "###";
+ position: absolute;
+ left: 0;
+ color: var(--gb-bg-4);
+ font-weight: 400;
+ font-size: 0.85em;
+}
+
+/* h4 — #### blue */
+h4 {
+ font-size: 0.95rem;
+ font-weight: 600;
+ margin-top: 1.6rem;
+ color: var(--gb-blue);
+ padding-left: 2.7rem;
+ position: relative;
+}
+
+h4::before {
+ content: "####";
+ position: absolute;
+ left: 0;
+ color: var(--gb-bg-4);
+ font-weight: 400;
+ font-size: 0.85em;
+}
+
+/* ─── Paragraphs ────────────────────────────────────────── */
+p {
+ margin: 1.2rem 0;
+ color: var(--gb-fg-1);
+ font-size: 0.95rem;
+}
+
+/* ─── Meta / Byline ─────────────────────────────────────── */
+.meta,
+time,
+.byline {
+ display: block;
+ font-size: 0.78rem;
+ color: var(--gb-bg-4);
+ margin-bottom: 2rem;
+ letter-spacing: 0.02em;
+}
+
+/* Fake prompt prefix on time/meta */
+.meta::before,
+time::before {
+ content: "$ date --iso ";
+ color: var(--gb-green);
+}
+
+/* ─── Links ─────────────────────────────────────────────── */
+a {
+ color: var(--gb-blue);
+ text-decoration: none;
+ border-bottom: 1px solid var(--gb-blue-n);
+ transition:
+ color var(--transition),
+ border-color var(--transition);
+}
+
+a:hover {
+ color: var(--gb-aqua);
+ border-bottom-color: var(--gb-aqua);
+}
+
+/* ─── Lists ─────────────────────────────────────────────── */
+ul,
+ol {
+ margin: 1.2rem 0;
+ padding-left: 0;
+ list-style: none;
+}
+
+ul li,
+ol li {
+ position: relative;
+ padding-left: 2rem;
+ margin: 0.4rem 0;
+ color: var(--gb-fg-1);
+ font-size: 0.95rem;
+}
+
+/* ul — orange arrow */
+ul li::before {
+ content: "->";
+ position: absolute;
+ left: 0;
+ color: var(--gb-orange);
+ font-weight: 500;
+}
+
+ol {
+ counter-reset: ol-counter;
+}
+ol li {
+ counter-increment: ol-counter;
+}
+
+/* ol — yellow brackets */
+ol li::before {
+ content: "[" counter(ol-counter) "]";
+ position: absolute;
+ left: 0;
+ color: var(--gb-yellow);
+ font-size: 0.8rem;
+ top: 0.08em;
+}
+
+/* ─── Horizontal Rule ───────────────────────────────────── */
+hr {
+ border: none;
+ margin: 2.5rem 0;
+ height: 1px;
+ background: none;
+ position: relative;
+ overflow: visible;
+ display: flex;
+ align-items: center;
+}
+
+hr::before {
+ content: "# ────────────────────────────────────────────────────────";
+ color: var(--gb-bg-3);
+ font-family: var(--mono);
+ font-size: 0.82rem;
+ white-space: nowrap;
+ overflow: hidden;
+ max-width: 100%;
+}
+
+/* ─── Blockquote — purple, indented comment style ──────── */
+blockquote {
+ margin: 2rem 0;
+ padding: 0;
+ border: none;
+ background: none;
+ position: relative;
+}
+
+blockquote p {
+ margin: 0.3rem 0;
+ color: var(--gb-purple);
+ font-style: italic;
+ padding-left: 2rem;
+ position: relative;
+ font-size: 0.93rem;
+}
+
+blockquote p::before {
+ content: "//";
+ position: absolute;
+ left: 0;
+ color: var(--gb-bg-3);
+ font-style: normal;
+ font-weight: 500;
+}
+
+blockquote cite {
+ display: block;
+ margin-top: 0.5rem;
+ padding-left: 2rem;
+ font-size: 0.75rem;
+ color: var(--gb-bg-4);
+ font-style: normal;
+ position: relative;
+}
+
+blockquote cite::before {
+ content: "-- ";
+ color: var(--gb-bg-3);
+}
+
+/* ─── Tables ───────────────────────────────────────────── */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 1.8rem 0;
+ font-size: 0.85rem;
+ font-family: var(--mono);
+ background: var(--gb-bg);
+ border: 1px solid var(--gb-bg-2);
+ border-radius: var(--radius);
+ overflow: hidden;
+}
+
+thead {
+ background: var(--gb-bg-1);
+}
+
+th {
+ text-align: left;
+ padding: 0.55rem 1rem;
+ font-size: 0.75rem;
+ letter-spacing: 0.06em;
+ color: var(--gb-yellow);
+ border-bottom: 1px solid var(--gb-bg-2);
+ font-weight: 600;
+ text-transform: uppercase;
+}
+
+td {
+ padding: 0.5rem 1rem;
+ border-bottom: 1px solid var(--gb-bg-1);
+ color: var(--gb-fg-2);
+ vertical-align: top;
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+tbody tr:hover td {
+ background: var(--gb-bg-1);
+ color: var(--gb-fg);
+}
+
+/* ─── Inline Code ───────────────────────────────────────── */
+code {
+ font-family: var(--mono);
+ font-size: 0.88rem;
+ background: var(--gb-bg-1);
+ color: var(--gb-aqua);
+ padding: 0.12rem 0.38rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--gb-bg-3);
+}
+
+/* ─── Code Blocks ───────────────────────────────────────── */
+pre {
+ background: var(--gb-bg);
+ border: 1px solid var(--gb-bg-2);
+ padding: 0;
+ overflow: hidden;
+ border-radius: var(--radius);
+ margin: 1.8rem 0;
+ position: relative;
+}
+
+/* Fake terminal titlebar */
+pre::before {
+ content: " ● ● ● " attr(data-lang);
+ display: block;
+ background: var(--gb-bg-2);
+ padding: 0.4rem 0.9rem;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ color: var(--gb-bg-4);
+ letter-spacing: 0.06em;
+ border-bottom: 1px solid var(--gb-bg-3);
+}
+
+/* Prompt before first line of code */
+pre code {
+ display: block;
+ background: none;
+ border: none;
+ padding: 1rem 1.2rem 1.1rem;
+ color: var(--gb-fg);
+ font-size: 0.87rem;
+ line-height: 1.65;
+ overflow-x: auto;
+}
+
+/* Syntax color classes */
+pre .kw {
+ color: var(--gb-red);
+ font-weight: 500;
+}
+pre .fn {
+ color: var(--gb-green);
+}
+pre .str {
+ color: var(--gb-yellow);
+}
+pre .num {
+ color: var(--gb-purple);
+}
+pre .cm {
+ color: var(--gb-bg-4);
+ font-style: italic;
+}
+pre .kv {
+ color: var(--gb-aqua);
+}
+pre .op {
+ color: var(--gb-orange);
+}
+pre .type {
+ color: var(--gb-blue);
+}
+
+/* ─── Images ───────────────────────────────────────────── */
+img {
+ max-width: 100%;
+ height: auto;
+ display: block;
+ border-radius: var(--radius);
+ border: 1px solid var(--gb-bg-2);
+ margin: 2rem auto;
+ filter: sepia(8%) saturate(90%);
+}
+
+figure {
+ margin: 2rem 0;
+}
+
+figcaption {
+ font-size: 0.75rem;
+ color: var(--gb-bg-4);
+ text-align: center;
+ margin-top: 0.6rem;
+}
+
+figcaption::before {
+ content: "# ";
+ color: var(--gb-bg-3);
+}
+
+/* ─── Callouts — comment-block style ────────────────────── */
+aside,
+.note,
+.callout {
+ background: var(--gb-bg);
+ border: 1px solid var(--gb-bg-3);
+ border-left: 3px solid var(--gb-yellow);
+ border-radius: 0 var(--radius) var(--radius) 0;
+ padding: 0.9rem 1.1rem;
+ margin: 1.8rem 0;
+ font-size: 0.875rem;
+ color: var(--gb-fg-2);
+ position: relative;
+}
+
+aside strong,
+.callout strong {
+ font-size: 0.72rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ color: var(--gb-yellow);
+ display: block;
+ margin-bottom: 0.3rem;
+}
+
+.callout.warn {
+ border-left-color: var(--gb-orange);
+}
+.callout.warn strong {
+ color: var(--gb-orange);
+}
+.callout.error {
+ border-left-color: var(--gb-red);
+}
+.callout.error strong {
+ color: var(--gb-red);
+}
+.callout.ok {
+ border-left-color: var(--gb-green);
+}
+.callout.ok strong {
+ color: var(--gb-green);
+}
+.callout.info {
+ border-left-color: var(--gb-blue);
+}
+.callout.info strong {
+ color: var(--gb-blue);
+}
+
+/* ─── Tags ─────────────────────────────────────────────── */
+.tag {
+ display: inline-block;
+ font-family: var(--mono);
+ font-size: 0.7rem;
+ padding: 0.18rem 0.5rem;
+ background: var(--gb-bg-1);
+ border: 1px solid var(--gb-bg-3);
+ border-radius: var(--radius);
+ color: var(--gb-fg-3);
+ margin-right: 0.35rem;
+ text-decoration: none;
+ border-bottom: none;
+ transition: all var(--transition);
+}
+
+.tag::before {
+ content: "#";
+ color: var(--gb-bg-4);
+ margin-right: 1px;
+}
+
+.tag:hover {
+ background: var(--gb-bg-2);
+ color: var(--gb-yellow);
+ border-color: var(--gb-yellow);
+ border-bottom: none;
+}
+
+/* ─── Navigation — shell PS1 style ──────────────────────── */
+nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0.8rem 0 2.5rem;
+ border-bottom: 1px solid var(--gb-bg-2);
+ margin-bottom: 3rem;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+nav .logo {
+ font-family: var(--mono);
+ font-weight: 700;
+ font-size: 0.95rem;
+ color: var(--gb-fg);
+ text-decoration: none;
+ border-bottom: none;
+ display: flex;
+ align-items: center;
+ gap: 0;
+}
+
+/* PS1 prompt segments */
+nav .logo .prompt-user {
+ color: var(--gb-green);
+}
+nav .logo .prompt-at {
+ color: var(--gb-fg-3);
+}
+nav .logo .prompt-host {
+ color: var(--gb-blue);
+}
+nav .logo .prompt-colon {
+ color: var(--gb-fg-3);
+}
+nav .logo .prompt-path {
+ color: var(--gb-yellow);
+}
+nav .logo .prompt-sign {
+ color: var(--gb-orange);
+ margin-left: 4px;
+}
+
+nav ul {
+ display: flex;
+ gap: 0.2rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+nav ul li {
+ padding: 0;
+ margin: 0;
+}
+nav ul li::before {
+ display: none;
+}
+
+nav a {
+ font-family: var(--mono);
+ font-size: 0.75rem;
+ color: var(--gb-fg-3);
+ text-decoration: none;
+ border-bottom: none;
+ padding: 0.2rem 0.6rem;
+ border-radius: var(--radius);
+ transition: all var(--transition);
+}
+
+nav a:hover {
+ color: var(--gb-fg);
+ background: var(--gb-bg-1);
+ border-bottom: none;
+}
+
+/* ─── Footer ───────────────────────────────────────────── */
+footer {
+ margin-top: 4rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid var(--gb-bg-2);
+ font-size: 0.75rem;
+ color: var(--gb-bg-4);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+footer::before {
+ content: none;
+}
+
+.footer-prompt::before {
+ content: "$ exit # ";
+ color: var(--gb-green);
+}
+
+/* ─── Reading Progress — yellow ────────────────────────── */
+.progress-bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 2px;
+ background: linear-gradient(90deg, var(--gb-yellow), var(--gb-orange));
+ z-index: 999;
+ width: 0%;
+ box-shadow: 0 0 8px rgba(250, 189, 47, 0.3);
+ transition: width 0.1s linear;
+}
+
+/* ─── Blinking cursor decoration ────────────────────────── */
+.cursor::after {
+ content: "█";
+ color: var(--gb-yellow);
+ animation: blink 1.1s step-end infinite;
+ margin-left: 2px;
+ font-weight: 400;
+}
+
+@keyframes blink {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+}
+
+/* ─── Selection ────────────────────────────────────────── */
+::selection {
+ background: var(--gb-bg-3);
+ color: var(--gb-yellow);
+}
+
+/* ─── Scrollbar ────────────────────────────────────────── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+::-webkit-scrollbar-track {
+ background: var(--gb-bg-hard);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--gb-bg-2);
+ border-radius: 1px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--gb-bg-3);
+}
+
+/* ─── Abbr ─────────────────────────────────────────────── */
+abbr[title] {
+ border-bottom: 1px dashed var(--gb-bg-4);
+ cursor: help;
+ text-decoration: none;
+}
+
+/* ─── Responsive ───────────────────────────────────────── */
+@media (max-width: 700px) {
+ body {
+ padding: 2rem 1rem 4rem;
+ font-size: 13.5px;
+ }
+ h1 {
+ font-size: 1.2rem;
+ }
+ h2 {
+ font-size: 1.05rem;
+ }
+ nav ul {
+ gap: 0;
+ }
+ footer {
+ flex-direction: column;
+ }
+}
+
+/* ─── Focus Accessibility ──────────────────────────────── */
+:focus-visible {
+ outline: 1px solid var(--gb-yellow);
+ outline-offset: 2px;
+ border-radius: var(--radius);
+}