diff options
| author | Himanshu Sardana <himanshusardana2005@gmail.com> | 2026-03-17 00:42:57 +0000 |
|---|---|---|
| committer | Himanshu Sardana <himanshusardana2005@gmail.com> | 2026-03-17 00:42:57 +0000 |
| commit | 7f523be08a01cc7d2952c19fa5ccf3645acc8e6a (patch) | |
| tree | e98adf856a4e95da2725f210b22c67452c910b41 /themes | |
| parent | 2bc62aaa80335269871949d4092f0d357904fbb4 (diff) | |
feat: add blog themes
Diffstat (limited to 'themes')
| -rw-r--r-- | themes/everforest.css | 634 | ||||
| -rw-r--r-- | themes/modern-dark-2.css | 547 | ||||
| -rw-r--r-- | themes/modern-dark-catppuccin.css | 679 | ||||
| -rw-r--r-- | themes/modern-dark.css | 546 | ||||
| -rw-r--r-- | themes/modern-light.css | 492 | ||||
| -rw-r--r-- | themes/rose-pine.css | 1438 | ||||
| -rw-r--r-- | themes/terminal-gruvbox.css | 744 |
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); +} |
