feat: add Shiki syntax highlighting to markdown via rehype-pretty-code

This commit is contained in:
2026-04-22 00:12:03 +02:00
parent 4e8975d947
commit fb3718cf12
4 changed files with 176 additions and 17 deletions

View File

@@ -1,9 +1,9 @@
@import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap");
@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap');
@import 'tailwindcss';
@plugin "@tailwindcss/typography";
@theme {
--font-sans: "Manrope", ui-sans-serif, system-ui, sans-serif;
--font-sans: 'Manrope', ui-sans-serif, system-ui, sans-serif;
}
:root {
@@ -28,7 +28,7 @@
--hero-b: rgba(47, 106, 74, 0.2);
}
:root[data-theme="dark"] {
:root[data-theme='dark'] {
--sea-ink: #d7ece8;
--sea-ink-soft: #afcdc8;
--lagoon: #60d7cf;
@@ -51,7 +51,7 @@
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
:root:not([data-theme='light']) {
--sea-ink: #d7ece8;
--sea-ink-soft: #afcdc8;
--lagoon: #60d7cf;
@@ -92,28 +92,45 @@ body {
background:
radial-gradient(1100px 620px at -8% -10%, var(--hero-a), transparent 58%),
radial-gradient(1050px 620px at 112% -12%, var(--hero-b), transparent 62%),
radial-gradient(720px 380px at 50% 115%, rgba(79, 184, 178, 0.1), transparent 68%),
linear-gradient(180deg, color-mix(in oklab, var(--sand) 68%, white) 0%, var(--foam) 44%, var(--bg-base) 100%);
radial-gradient(
720px 380px at 50% 115%,
rgba(79, 184, 178, 0.1),
transparent 68%
),
linear-gradient(
180deg,
color-mix(in oklab, var(--sand) 68%, white) 0%,
var(--foam) 44%,
var(--bg-base) 100%
);
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body::before {
content: "";
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: -1;
opacity: 0.28;
background:
radial-gradient(circle at 20% 15%, rgba(255, 255, 255, 0.8), transparent 34%),
radial-gradient(circle at 78% 26%, rgba(79, 184, 178, 0.2), transparent 42%),
radial-gradient(
circle at 20% 15%,
rgba(255, 255, 255, 0.8),
transparent 34%
),
radial-gradient(
circle at 78% 26%,
rgba(79, 184, 178, 0.2),
transparent 42%
),
radial-gradient(circle at 42% 82%, rgba(47, 106, 74, 0.14), transparent 36%);
}
body::after {
content: "";
content: '';
position: fixed;
inset: 0;
pointer-events: none;
@@ -160,7 +177,7 @@ pre code {
}
.display-title {
font-family: "Fraunces", Georgia, serif;
font-family: 'Fraunces', Georgia, serif;
}
.island-shell {
@@ -174,7 +191,11 @@ pre code {
}
.feature-card {
background: linear-gradient(165deg, color-mix(in oklab, var(--surface-strong) 93%, white 7%), var(--surface));
background: linear-gradient(
165deg,
color-mix(in oklab, var(--surface-strong) 93%, white 7%),
var(--surface)
);
box-shadow:
0 1px 0 var(--inset-glint) inset,
0 18px 34px rgba(30, 90, 72, 0.1),
@@ -189,7 +210,10 @@ pre code {
button,
.island-shell,
a {
transition: background-color 180ms ease, color 180ms ease, border-color 180ms ease,
transition:
background-color 180ms ease,
color 180ms ease,
border-color 180ms ease,
transform 180ms ease;
}
@@ -210,7 +234,7 @@ a {
}
.nav-link::after {
content: "";
content: '';
position: absolute;
left: 0;
bottom: -6px;
@@ -257,3 +281,66 @@ a {
transform: translateY(0);
}
}
/* ── Syntax Highlighting (rehype-pretty-code / Shiki) ─────────────────── */
/* Code block wrapper */
figure[data-rehype-pretty-code-figure] {
margin: 1.5rem 0;
border-radius: 0.75rem;
overflow: hidden;
border: 1px solid var(--line);
}
/* Title bar (e.g. ```ts filename.ts) */
[data-rehype-pretty-code-title] {
background: var(--surface-strong);
color: var(--sea-ink-soft);
font-size: 0.75rem;
font-family: 'Manrope', sans-serif;
padding: 0.5rem 1rem;
border-bottom: 1px solid var(--line);
letter-spacing: 0.04em;
}
/* The <pre> block */
pre[data-theme] {
background: var(--surface) !important;
padding: 1.25rem 1.5rem;
overflow-x: auto;
font-size: 0.875rem;
line-height: 1.7;
}
/* Inline code */
:not(pre) > code[data-theme] {
background: var(--chip-bg);
border: 1px solid var(--chip-line);
border-radius: 0.3rem;
padding: 0.15em 0.45em;
font-size: 0.85em;
}
/* Highlighted line */
span[data-highlighted-line] {
background: color-mix(in oklch, var(--lagoon) 12%, transparent);
border-left: 2px solid var(--lagoon);
padding-left: calc(1.5rem - 2px);
margin-left: -1.5rem;
display: block;
}
/* Line numbers */
code[data-line-numbers] {
counter-reset: line;
}
code[data-line-numbers] > [data-line]::before {
counter-increment: line;
content: counter(line);
display: inline-block;
width: 1rem;
margin-right: 1.5rem;
text-align: right;
color: var(--sea-ink-soft);
opacity: 0.4;
}