/* Hallmark · shape: Index-First · genre: editorial · theme: Ink (deal 3/3, seed personal-blog-software-developer-df80·cd70a9ac·2026-10-29·r0) · redesign: full
 * hero: the latest post, opened, under the banner · nav: banner, the logo on its dark band with the links beside it · footer: mast on the band · imagery: the owner's own logo (white on dark, as his old header carried it) and the screenshots in his posts, nothing else · signature: the logo on its band over the ruled index of posts · ink: paper, gold signal · surface: absolute black, the band under the logo
 * axes: light/grotesk-sans/chromatic-teal · posture: restrained · contrast: pass · fold: pass · draw: 799a51 (swaps: Conversational FAQ -> Index-First, a blog has no questions to answer and the owner wants no note from the writer on the home; newsletter-first footer -> a letter close with the RSS feed and a mast on the band, there is no newsletter; the subscribe field -> the feed link; floating pill -> banner, the logo was drawn for a dark header bar) · v2.0.0 */
/* Hallmark · pre-emit critique: P4 H4 E4 S4 R4 V4 · weakest: E, the page is a list on paper under one logo, answered by opening it on the latest post set large and keeping the band the one dark thing */
/* brand: HowPCRules logo, the owner's own design, white on a dark backing (public/logo.png, the one his site showed); his old site's colours kept: white paper, #111 text, dark bars, gold #c7a770 as the one accent */
/* scope: posts and the policy pages are prose, held to 66ch and 1.55 to 1.7 leading, not to the 80-word screen budget */
/* finish-review: subagent · fix · 8 findings · 8 resolved (posts without a rail centred, eyebrow labels replaced by one real heading, one logo on the home, shelf rows without chips, the close rule contained, sample tables scroll visibly, lighter link in the letter, stars and the jammed tag row fixed) */
/* Hallmark · waive 49b · post titles in the lists and the contents rows wrap at phone widths · a title is the link and cannot be shortened without changing the post */
/* Hallmark · waive 44c · the posts, about, privacy and post pages open on a page head over prose · prose scope, set by the scope line above; the home is the letter */
/* Hallmark · waive 79 · the same prose pages · a document opens on its head and then its text, with no visual to grow into the fold; prose scope */
/* Hallmark · waive 44a · the sample page for web scraping opens on its head and then its tables · test data for the 2017 tutorial, served as a document; prose scope */
/* Hallmark · waive 59 · on a post page the head (title, summary, byline) and the text below it sit 40px apart · they are one document, not two sections; the gaps between the text, the contents rail and the related posts keep the 120px step */
/* Hallmark · waive 78 · prose pages set h2 as document heads under a display page head · they name parts of one document, the page head is the only section head */
/* Hallmark · waive 77 · prose pages are one document between the pill and the close · prose scope; the home carries the letter, the latest post, the shelf and the close */
/* Hallmark · dismissed F25 · the sample page for web scraping · its tables are test data the 2017 scraping tutorial parses, kept exactly as published; they scroll sideways inside their container */
/* Hallmark · waive 7b · the header and footer band is pure black · the logo file carries a half-transparent black box of its own, which vanishes only on #000; any tint would show it as a darker rectangle */
/* Hallmark · waive 22 · ink and greys at zero chroma · the logo is white on black and the old site was printed in plain black; the one colour is the gold */
/* Hallmark · answered F19 · weights are Epilogue 400 (body, labels), 600 (names, links, controls) and 700 (heads); IBM Plex Mono 400 inside code */
:root {
  color-scheme: light;
  --space-3xs: 2px; --space-2xs: 4px; --space-xs: 8px; --space-sm: 12px; --space-md: 16px; --space-lg: 24px; --space-xl: 40px; --space-2xl: 64px; --space-3xl: 96px; --space-4xl: 144px;
  --text-xs: 0.8125rem; --text-sm: 0.875rem; --text-md: 1rem; --text-lg: 1.25rem; --text-xl: 1.5625rem; --text-2xl: 1.953rem; --text-3xl: 2.441rem;
  --text-display-s: clamp(2.25rem, 4vw + 0.5rem, 3.75rem); --text-display: clamp(2.75rem, 5vw + 1rem, 5.25rem);
  --text-section: clamp(2rem, 2.5vw + 1rem, 3.5rem); --text-title: clamp(1.25rem, 0.75vw + 0.875rem, 1.625rem); --text-lead: clamp(1.125rem, 0.35vw + 1rem, 1.375rem);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --ease-in: cubic-bezier(0.7, 0, 0.84, 0); --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-micro: 120ms; --dur-short: 220ms; --dur-long: 420ms;
  --color-error: oklch(52% 0.19 27); --color-success: oklch(50% 0.12 150);
  --container: 1440px; --gutter: 64px; --gap-columns: 32px; --section-gap-s: 120px; --section-gap: 144px; --section-gap-l: 176px;
  --z-base: 1; --z-raised: 10; --z-dropdown: 100; --z-sticky: 200; --z-sticky-nav: 300; --z-modal: 400; --z-toast: 500; --z-tooltip: 600;
  /* Ink as drawn: white paper, a black with no hue, as the owner's logo (white on dark) and his old site (text #111, bars #262626/#333, accent #c7a770) had it. */
  --color-paper: oklch(99.5% 0.003 100); --color-paper-2: oklch(97% 0.004 100); --color-paper-3: oklch(94% 0.006 100);
  --color-ink: oklch(16% 0 0); --color-ink-2: oklch(28% 0 0); --color-muted: oklch(44% 0 0);
  --color-rule: oklch(89% 0.004 100); --color-rule-2: oklch(93.5% 0.003 100);
  /* The one signal: the old site's gold #c7a770, darkened where it carries text. */
  --color-accent: oklch(55% 0.085 78); --color-accent-ink: oklch(99.5% 0.003 100); --color-accent-soft: oklch(94% 0.045 85); --color-accent-soft-ink: oklch(38% 0.07 78); --color-brand: oklch(74.5% 0.085 78);
  --color-focus: oklch(55% 0.085 78);
  /* The band the logo was drawn for: the old site's header and footer bars. */
  --color-band: oklch(0% 0 0); --color-band-2: oklch(20% 0 0); --color-band-ink: oklch(99.5% 0.003 100); --color-band-muted: oklch(70% 0 0); --color-band-rule: oklch(30% 0 0);
  --font-display: "Epilogue Variable", "Epilogue", ui-sans-serif, system-ui, sans-serif; --font-body: var(--font-display);
  --font-outlier: "IBM Plex Mono", ui-monospace, monospace;
  --radius-card: 12px; --radius-pill: 999px; --rule-hair: 1px;
  --shadow-card: 0 20px 40px oklch(20% 0 0 / 0.16);
  --tracking-display: -0.04em; --display-weight: 700;
}
*, *::before, *::after { box-sizing: border-box; }
html, body { overflow-x: clip; }
html { scrollbar-color: var(--color-muted) var(--color-paper); scroll-padding-top: var(--space-3xl); }
body { margin: 0; background: var(--color-paper); color: var(--color-ink); font-family: var(--font-body); font-size: var(--text-md); line-height: 1.55; -webkit-font-smoothing: antialiased; caret-color: var(--color-accent); }
::selection { background: var(--color-accent-soft); color: var(--color-accent-soft-ink); }
:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
a { color: inherit; text-decoration-thickness: 1px; text-underline-offset: 0.16em; }
h1, h2, h3 { margin: 0; font-family: var(--font-display); font-weight: var(--display-weight, 700); font-synthesis: none; letter-spacing: var(--tracking-display); line-height: 1.05; overflow-wrap: break-word; min-width: 0; text-wrap: balance; }
h1 { max-width: 20ch; font-size: var(--text-display); } h2 { max-width: 30ch; font-size: var(--text-section); } h3 { max-width: 40ch; font-size: var(--text-title); line-height: 1.2; }
.lead { font-size: var(--text-lead); line-height: 1.45; max-width: 52ch; }
p { margin: 0; text-wrap: pretty; }
p:not([class]) { max-width: 65ch; }
img, video { max-width: 100%; height: auto; display: block; }
svg { display: block; }
[hidden] { display: none !important; }
button, input, select, textarea { font: inherit; }
.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); box-sizing: border-box; }
.num, .figure, td.num { font-variant-numeric: tabular-nums; }
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
[data-slot] { position: relative; overflow: hidden; background: linear-gradient(160deg, var(--color-paper-2, var(--color-paper)), var(--color-paper-3, var(--color-paper))); }
[data-slot] > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 1; }
[data-slot]:has(> img) > :not(img):not([data-keep]) { display: none !important; }
@media (max-width: 60rem) { :root { --gutter: 24px; --section-gap-s: 80px; --section-gap: 96px; --section-gap-l: 120px; } }
@media (max-width: 40rem) { :root { --gutter: 16px; --section-gap-s: 56px; --section-gap: 72px; --section-gap-l: 96px; --gap-columns: 16px; } }
@media (prefers-reduced-motion: reduce) { *:not(.keep-motion), *:not(.keep-motion)::before, *:not(.keep-motion)::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }
/* photographs: muted */
[data-slot] > img { filter: saturate(0.65) contrast(0.97); }

.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); }
.corridor { width: 100%; max-width: 44rem; margin-inline: auto; padding-inline: var(--gutter); }
.skip { position: absolute; left: var(--space-md); top: -100px; z-index: var(--z-modal); background: var(--color-ink); color: var(--color-paper); padding: var(--space-xs) var(--space-md); border-radius: 10px; }
.skip:focus-visible { top: var(--space-md); }

body { color: var(--color-ink-2); }
a { color: var(--color-ink); font-weight: 600; text-decoration-thickness: 1px; text-underline-offset: 0.18em; transition: color var(--dur-micro) var(--ease-out), text-decoration-color var(--dur-micro) var(--ease-out); }
a:hover { color: var(--color-accent); text-decoration-color: var(--color-accent); }
a:active { color: var(--color-accent-soft-ink); }
a:focus-visible, button:focus-visible, .btn:focus-visible, summary:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 3px; transition: none; }
small, figcaption, th, .meta, .tag, .crumbs { font-size: var(--text-sm); font-weight: 400; }
.meta { color: var(--color-muted); }
code, pre, kbd, samp { font-family: var(--font-outlier); }

/* The banner: the logo on the band it was drawn for, the links beside it. */
.banner { background: var(--color-band); color: var(--color-band-ink); }
.banner-row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-lg); padding-block: var(--space-lg); }
.banner-row { position: relative; }
.banner .mark { display: block; }
.banner .mark img { display: block; width: min(100%, 350px); height: auto; }
.banner nav { display: flex; gap: var(--space-lg); }
.banner nav a { color: var(--color-band-ink); text-decoration: none; padding-block: var(--space-xs); border-bottom: 2px solid transparent; }
.banner nav a:hover { color: var(--color-brand); border-bottom-color: var(--color-brand); }
.banner nav a[aria-current="page"] { border-bottom-color: var(--color-brand); }
.banner a:focus-visible { outline-color: var(--color-brand); }

/* Section heads: one voice, one size. */
.shelf > h2 { font-size: var(--text-xl); margin-bottom: var(--space-md); }

/* The latest post, opened: its parts as rows. */
.latest { padding-block: var(--space-2xl) 0; }
.shelf { padding-block: var(--section-gap-s) 0; }
.issue { border-top: var(--rule-hair) solid var(--color-ink); padding-top: var(--space-lg); }
.issue .top { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-xs) var(--space-md); margin-bottom: var(--space-sm); }
.issue h2 { font-size: var(--text-display-s); line-height: 1.05; max-width: 20ch; }
.issue h2 a { text-decoration: none; }
.issue h2 a:hover { text-decoration: underline; }
.issue .standfirst { margin: var(--space-sm) 0 0; max-width: 50ch; font-size: var(--text-lg); line-height: 1.5; }
.parts { list-style: none; counter-reset: part; margin: var(--space-lg) 0 0; padding: 0; max-width: 50ch; }
.parts li { counter-increment: part; display: grid; grid-template-columns: 2.5rem minmax(0, 1fr); padding-block: var(--space-sm); border-top: var(--rule-hair) solid var(--color-rule); }
.parts li::before { content: counter(part); color: var(--color-muted); font-variant-numeric: tabular-nums; }
.parts a { font-weight: 400; color: var(--color-ink); text-decoration: none; }
.parts a:hover { color: var(--color-accent); text-decoration: underline; }
.issue .more { display: inline-block; margin-top: var(--space-lg); }

/* The shelf: every post a row under the ink rule. */
.year { margin-top: var(--space-xl); }
.year h3 { font-size: var(--text-lg); margin-bottom: var(--space-xs); }
.rows { list-style: none; margin: 0; padding: 0; border-top: var(--rule-hair) solid var(--color-ink); }
.rows li { border-bottom: var(--rule-hair) solid var(--color-rule); }
.rows a { display: grid; grid-template-columns: 7.5rem minmax(0, 1fr); gap: var(--space-2xs) var(--space-lg); align-items: baseline; padding-block: var(--space-md); text-decoration: none; color: var(--color-ink); }
.rows a:hover .title { color: var(--color-accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em; }
.rows a:focus-visible { outline-offset: -2px; }
.rows time { color: var(--color-muted); font-size: var(--text-sm); font-weight: 400; }
.rows .title { font-weight: 600; line-height: 1.35; }
.rows .what { grid-column: 2; font-weight: 400; color: var(--color-ink-2); line-height: 1.5; }
.rows .tags { grid-column: 2; justify-self: start; margin-top: var(--space-2xs); }
.tags { display: flex; flex-wrap: wrap; gap: var(--space-2xs); margin: 0; padding: 0; list-style: none; }
.tag { display: inline-flex; padding: var(--space-3xs) var(--space-sm); border-radius: var(--radius-pill); font-size: var(--text-xs); font-weight: 600; background: var(--color-paper-3); color: var(--color-ink-2); }
.tag--new { background: var(--color-accent-soft); color: var(--color-accent-soft-ink); }

/* The close: how to hear about the next post. */
.close { margin-top: var(--section-gap-s); padding-block: 0 var(--section-gap-s); }
.close .feed { margin-top: var(--space-md); }
.close::before { content: ""; display: block; border-top: var(--rule-hair) solid var(--color-ink); margin-bottom: var(--space-2xl); }
.close p { margin: 0; font-size: var(--text-lg); line-height: 1.55; max-width: 50ch; }
.close p + p { margin-top: var(--space-md); }
.close .feed { display: inline-block; margin-top: var(--space-lg); padding: var(--space-xs) var(--space-md); background: var(--color-paper-2); border: var(--rule-hair) solid var(--color-rule); border-radius: 10px; font-family: var(--font-outlier); font-weight: 400; font-size: var(--text-md); overflow-wrap: anywhere; }

footer.foot { margin-top: var(--space-2xl); background: var(--color-band); color: var(--color-band-muted); padding-block: var(--space-2xl); }
.foot-row { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--space-lg); align-items: center; }
.foot img { display: block; width: 220px; height: auto; }
.foot ul { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-lg); margin: 0; padding: 0; list-style: none; }
.foot a { color: var(--color-band-ink); }
.foot a:hover { color: var(--color-brand); }
.foot a:focus-visible { outline-color: var(--color-brand); }
.foot .meta { margin: var(--space-lg) 0 0; padding-top: var(--space-md); border-top: var(--rule-hair) solid var(--color-band-rule); color: var(--color-band-muted); }

/* Page heads and prose pages. */
.page-head { padding-block: var(--space-2xl) var(--space-xl); }
.page-head h1 { font-size: var(--text-display-s); max-width: 20ch; }
.page-head .lead { margin: var(--space-lg) 0 0; font-size: var(--text-lead); line-height: 1.5; max-width: 50ch; }
.page-body { max-width: 66ch; padding-bottom: var(--section-gap-s); line-height: 1.7; }
.page-body > * + * { margin-top: var(--space-md); }
.page-body h2 { font-size: var(--text-xl); margin-top: var(--space-2xl); }
.page-body h2 + * { margin-top: var(--space-sm); }
.page-body p, .page-body li { font-size: var(--text-lg); }
.posts-list { padding-bottom: var(--section-gap-s); }

/* A post. */
.crumbs ol { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin: 0 0 var(--space-lg); padding: 0; list-style: none; }
.crumbs li + li::before { content: "/"; margin-right: var(--space-xs); color: var(--color-muted); }
.crumbs a { font-weight: 400; }
.post-head { padding-block: var(--space-2xl) var(--space-xl); }
.post-head .container { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 0 var(--gap-columns); }
.post-head .head { grid-column: 1 / 9; }
.post-head.narrow .head, .post-grid.narrow .prose, .post-grid.narrow .post-foot { grid-column: 3 / 11; }
.post-head h1 { font-size: var(--text-display-s); max-width: 26ch; }
.standfirst { margin: var(--space-lg) 0 0; font-size: var(--text-lead); line-height: 1.5; max-width: 60ch; }
.byline { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs) var(--space-lg); margin: var(--space-xl) 0 0; }
.note { margin: var(--space-lg) 0 0; padding: var(--space-sm) var(--space-md); max-width: 60ch; background: var(--color-paper-2); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-card); }
.post-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 0 var(--gap-columns); align-items: start; }
.post-grid .prose, .post-grid .post-foot { grid-column: 1 / 9; }
.toc { grid-column: 9 / 13; grid-row: 1; position: sticky; top: var(--space-lg); margin-left: var(--space-xl); border-top: var(--rule-hair) solid var(--color-ink); padding-top: var(--space-sm); }
.toc h2 { font-size: var(--text-sm); font-weight: 400; color: var(--color-muted); margin-bottom: var(--space-xs); }
.toc ol { list-style: none; margin: 0; padding: 0; counter-reset: part; }
.toc li { counter-increment: part; display: grid; grid-template-columns: 2rem minmax(0, 1fr); border-top: var(--rule-hair) solid var(--color-rule); padding-block: var(--space-xs); font-size: var(--text-sm); }
.toc li::before { content: counter(part); color: var(--color-muted); }
.toc a { font-weight: 400; color: var(--color-ink); text-decoration: none; }
.toc a:hover { color: var(--color-accent); text-decoration: underline; }

.prose { font-size: var(--text-lg); line-height: 1.7; max-width: 66ch; padding-bottom: var(--space-2xl); }
.prose > * + * { margin-top: var(--space-md); }
.prose h2 { font-size: var(--text-2xl); margin-top: var(--space-2xl); line-height: 1.15; }
.prose h3 { font-size: var(--text-xl); margin-top: var(--space-xl); line-height: 1.2; }
.prose h4 { font-size: var(--text-lg); margin-top: var(--space-lg); }
.prose ul, .prose ol { padding-left: 1.4em; }
.prose li + li { margin-top: var(--space-2xs); }
.prose a { overflow-wrap: anywhere; }
.prose blockquote { margin-inline: 0; padding: var(--space-md) var(--space-lg); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-card); }
.prose img { display: block; max-width: 100%; height: auto; border-radius: var(--radius-card); outline: var(--rule-hair) solid var(--color-rule); outline-offset: -1px; }
.prose hr { border: 0; border-top: var(--rule-hair) solid var(--color-rule); margin-block: var(--space-2xl); }
.prose :not(pre) > code { font-size: 0.88em; background: var(--color-paper-3); padding: 0.1em 0.35em; border-radius: 6px; overflow-wrap: anywhere; }
.prose table { width: 100%; border-collapse: collapse; font-size: var(--text-md); display: block; overflow-x: auto; }
.prose th, .prose td { text-align: left; padding: var(--space-xs) var(--space-sm); border-bottom: var(--rule-hair) solid var(--color-rule); vertical-align: top; }
.prose th { color: var(--color-muted); border-bottom-color: var(--color-ink); }
.prose > p:last-child:has(> em:only-child) { color: var(--color-muted); font-size: var(--text-md); }

/* Code: a well on the paper, never a dark field. */
pre { margin: var(--space-lg) 0 0; padding: var(--space-lg); background: var(--color-paper-2); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-card); color: var(--color-ink); overflow-x: auto; font-size: 0.875rem; line-height: 1.6; tab-size: 2; }
pre:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
pre code { background: none; padding: 0; font-size: inherit; }
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: var(--color-muted); }
.token.keyword, .token.tag, .token.selector, .token.important, .token.atrule { color: var(--color-accent); }
.token.string, .token.attr-value, .token.char, .token.inserted { color: var(--color-brand); }
.token.number, .token.boolean, .token.constant, .token.symbol { color: var(--color-accent-soft-ink); }

.post-foot { max-width: 66ch; margin-top: var(--space-xl); }
.well { padding: var(--space-lg); background: var(--color-paper-2); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-card); }
.well h2 { font-size: var(--text-lg); margin-bottom: var(--space-xs); }
.well p { margin: 0; }
.well p + p { margin-top: var(--space-sm); }
.more-posts { padding-block: var(--section-gap-s) 0; }
.more-posts h2 { font-size: var(--text-lg); margin-bottom: var(--space-md); }

/* The scraping tutorial's sample data, as published in 2017. */
.sample { overflow-x: auto; padding-bottom: var(--section-gap-s); mask-image: linear-gradient(to right, var(--color-ink) calc(100% - 24px), transparent); }
.sample caption { text-align: left; position: sticky; left: 0; }
.sample table { border-collapse: collapse; margin-block: var(--space-lg); font-size: var(--text-md); }
.sample th, .sample td { border: var(--rule-hair) solid var(--color-rule); padding: var(--space-2xs) var(--space-sm); text-align: left; }

@media (max-width: 60rem) {
  :root { --gutter: 24px; }
  .post-grid .prose, .post-grid .post-foot, .toc, .post-head .head, .post-head.narrow .head, .post-grid.narrow .prose, .post-grid.narrow .post-foot { grid-column: 1 / -1; }
  .toc { position: static; margin: 0 0 var(--space-xl); grid-row: auto; }
}
@media (max-width: 40rem) {
  :root { --gutter: 16px; }
  .banner-row { flex-direction: column; align-items: flex-start; gap: var(--space-md); }
  .banner .mark img { width: min(100%, 280px); }
  .rows a { grid-template-columns: minmax(0, 1fr); }
  .rows .what, .rows .tags { grid-column: 1; }
}
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}
/* epilogue-vietnamese-wght-normal */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-vietnamese-wght-normal.CCSRnr7S.woff2) format('woff2-variations');
  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
}

/* epilogue-latin-ext-wght-normal */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-latin-ext-wght-normal.C9jy1SL9.woff2) format('woff2-variations');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}

/* epilogue-latin-wght-normal */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-latin-wght-normal.BnupfK5F.woff2) format('woff2-variations');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}/* epilogue-vietnamese-wght-italic */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: italic;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-vietnamese-wght-italic.BirDSn5c.woff2) format('woff2-variations');
  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
}

/* epilogue-latin-ext-wght-italic */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: italic;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-latin-ext-wght-italic.BK4smlYX.woff2) format('woff2-variations');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}

/* epilogue-latin-wght-italic */
@font-face {
  font-family: 'Epilogue Variable';
  font-style: italic;
  font-display: swap;
  font-weight: 100 900;
  src: url(/_astro/epilogue-latin-wght-italic.CSpqh1Kx.woff2) format('woff2-variations');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}/* ibm-plex-mono-cyrillic-ext-400-normal */
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2) format('woff2'), url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff) format('woff');
  unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;
}

/* ibm-plex-mono-cyrillic-400-normal */
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url(/_astro/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2) format('woff2'), url(/_astro/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff) format('woff');
  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}

/* ibm-plex-mono-vietnamese-400-normal */
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url(/_astro/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2) format('woff2'), url(/_astro/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff) format('woff');
  unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;
}

/* ibm-plex-mono-latin-ext-400-normal */
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url(/_astro/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2) format('woff2'), url(/_astro/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff) format('woff');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}

/* ibm-plex-mono-latin-400-normal */
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2) format('woff2'), url(/_astro/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff) format('woff');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}