:root { /* Fonts */ --body: "Inter Variable", sans-serif; --heading: "IBM Plex Sans Variable", sans-serif; --monospace: "IBM Plex Mono", monospace; /* Padding */ --padding-100: 0.5rem; --padding-200: 0.75rem; --padding-300: 1rem; --padding-400: 1.25rem; --padding-500: 1.5rem; --padding-600: 1.75rem; --padding-700: 2rem; /* Spacing */ --spacing-small: 2.5rem; --spacing-medium: 3rem; --spacing-large: 6rem; /* Widths */ --width-page: 60rem; --width-content: 50rem; --width-constrained: 72ch; /* UI */ --text: rgb(240 240 240); --text-2: rgb(200 200 200); --text-3: rgb(150 150 150); --primary: rgb(28 28 55); --secondary: rgb(15 12 35); --background: rgb(22 22 40); --accent-dark: rgb(45 45 65); --accent-light: rgb(50 50 80); /* Miscellaneous */ --header-height: 64px; } /* CSS Reset - Josh W. Comeau */ *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } input, button, textarea, select { font: inherit; } img, picture, video, canvas, svg { display: block; max-inline-size: 100%; block-size: auto; } /* Typography */ h1, h2, h3, h4, h5, h6 { font-family: var(--heading); font-variation-settings: 'wdth' 85; /* I have to add this due to a WebKit issue (215605) */ font-weight: 500; text-wrap: balance; overflow-wrap: break-word; } h1 { font-size: clamp(1.625rem, 1rem + 1.25vw, 1.75rem); line-height: 1.25em; } h2 { font-size: clamp(1.5rem, 0.875rem + 1.25vw, 1.625rem); line-height: 1.275em; } h3 { font-size: clamp(1.375rem, 0.75rem + 1.25vw, 1.5rem); line-height: 1.3em; } h4 { font-size: clamp(1.25rem, 0.625rem + 1.25vw, 1.375rem); line-height: 1.375em; } h5 { font-size: clamp(1.125rem, 0.5rem + 1.25vw, 1.25rem); line-height: 1.45em; } h6 { font-size: clamp(1rem, 0.375rem + 1.25vw, 1.125rem); } p { overflow-wrap: break-word; word-break: break-word; } a { color: var(--text); text-decoration: none; font-weight: 500; } a:is(:hover, :focus-visible) { color: var(--text-2); } strong { font-weight: 600; } pre { font-size: 0.875rem; padding: var(--padding-300); border: 1px solid var(--accent-dark); white-space: pre-wrap; } code { font-family: var(--monospace); } code:not(pre code) { background-color: var(--accent-dark); padding-inline: 0.125em; } time { font-weight: inherit; } /* Page elements */ html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; scrollbar-gutter: stable; } html:has(dialog[open]) { overflow: hidden; } body { font-family: var(--body); font-size: 1rem; line-height: 1.5; background-color: var(--background); color: var(--text); min-block-size: 100vh; display: flex; flex-direction: column; } main { flex: 1; } /* Header & navigation */ header { position: sticky; inset-block-start: 0; background-color: var(--primary); z-index: 10; } .main-navigation { display: flex; justify-content: space-between; align-items: center; padding: var(--padding-400) var(--padding-200); gap: var(--padding-400); } .site-title svg { block-size: 24px; } /* Main navigation */ .main-navigation a:is(:hover, :focus-visible) { color: var(--text-2); } #menu-button { display: none; font-size: inherit; } #menu-button:is(:hover, :focus-visible, [aria-expanded='true']) { color: var(--text-2); } /* Mobile menu */ .mobile-navigation { position: fixed; inline-size: 100%; background-color: var(--primary); inset-block-start: var(--header-height); border-block-end: 1px solid var(--accent-light); } .mobile-navigation.nav-open { display: block; } .mobile-navigation.nav-closed { display: none; } .mobile-navigation .row { gap: var(--padding-400); padding-inline: var(--padding-200); padding-block-end: var(--padding-600); } .mobile-navigation a { font-family: var(--heading); font-variation-settings: 'wdth' 85; font-size: 1.5rem; line-height: 1.35em; } .mobile-navigation a:is(:hover, :focus-visible) { color: var(--text-2); } /* Hero */ .hero { background: linear-gradient(var(--primary), var(--secondary)); border-block-end: 1px solid var(--accent-light); } .hero-inner { padding-block: var(--padding-600) var(--spacing-medium); padding-inline: var(--padding-200); } .hero-inner:not(.home) * + * { margin-block-start: var(--padding-500); } .hero-inner p { font-size: 0.875rem; color: var(--text-2); } /* Content specific */ .hero-inner .cover { border-radius: var(--padding-200); } /* Homepage specific */ .hero-inner.home { padding-block: 4.75rem var(--spacing-large); } .hero-inner.home h1 { font-size: clamp(2.125rem, 0.25rem + 3.75vw, 2.5rem); line-height: 1.3em; margin-block-end: 0; max-inline-size: 20ch; } .hero-inner.home p { color: var(--text); font-size: clamp(1rem, 0.375rem + 1.25vw, 1.125rem); max-inline-size: 35ch; } /* Container */ .container { padding: var(--spacing-medium) var(--padding-200); } .width-content, .width-page { margin-inline: auto; } .width-content { max-inline-size: var(--width-content); } .width-page { max-inline-size: var(--width-page); } /* Row */ .row { display: flex; flex-flow: wrap; align-items: center; gap: var(--padding-300); } .row:is(ul) { list-style: none; padding: 0; } .row.centered { justify-content: center; } .row.vertical { flex-direction: column; align-items: initial; } /* Link */ .link { display: inline-block; font-size: 0.875rem; cursor: pointer; } .link:is(button) { color: inherit; background: transparent; padding: 0; border: none; } /* Button-style links */ .link:is(.badge, .pill) { background-color: var(--primary); border: 1px solid var(--accent-light); border-radius: var(--padding-300); } .link:is(.badge, .pill):is(:hover, :focus-visible) { color: inherit; background-color: var(--accent-light); } .link.badge { padding: var(--padding-100) var(--padding-300); } .link.pill { padding: var(--padding-300); } /* With icon */ .link.icon { display: flex; align-items: center; gap: var(--padding-300); } .link.icon :is(img, svg) { inline-size: 20px; } /* Meta */ .link.meta { color: var(--text-2); } .link.meta:is(:hover, :focus-visible) { color: var(--text); } .link.meta.icon { gap: var(--padding-100); } .link.icon.meta :is(img, svg) { inline-size: 18px; } /* Pagination */ .pagination { padding-block-start: var(--spacing-medium); } .pagination .link { padding: var(--padding-200) var(--padding-400); border-radius: var(--padding-300); border: 1px solid var(--accent-dark); } .pagination .link:is(:hover, :focus-visible) { color: inherit; border: 1px solid var(--accent-light); background-color: var(--accent-light); } .pagination .link.current-page { background-color: var(--secondary); border: 1px solid var(--accent-light); cursor: default; } /* Reusable blocks for text content */ .block { border: 1px solid var(--accent-light); background-color: var(--secondary); border-radius: var(--padding-300); } .block-title { font-size: 1.125rem; padding: var(--padding-300); border-block-end: 1px solid var(--accent-light); } .block .block-content { padding: var(--padding-300); } .block .link:is(.badge, .pill) { border-radius: var(--padding-100); } /* Overview */ .block.overview { margin-block-end: var(--spacing-small); } .block.overview .block-content { padding: var(--padding-500) var(--padding-300); } .score { font-size: 1.875rem; line-height: 1.125em; margin-block-end: var(--padding-500); } /* Dialog & modal */ dialog.block { padding: unset; margin: auto; color: inherit; inline-size: var(--width-constrained); animation: dialog cubic-bezier(0.86,0,0.07,1) 0.5s both; } dialog::backdrop { background-color: rgb(0 0 0 / 0.5); } dialog.block .block-title { font-size: 1.25rem; } dialog.block .block-content { overflow-y: scroll; max-block-size: 25dvh; scrollbar-width: none; } dialog .options { border-block-start: 1px solid var(--accent-light); } dialog .options .row { justify-content: end; } @keyframes dialog { 0% { scale: 0.95; opacity: 0%; } 100% { scale: 1; opacity: 100%; } } /* Block alt */ .block.opt-out { border-style: dashed; border-color: var(--accent-light); background-color: initial; } .block.opt-out .block-content p { font-size: 0.875rem; color: var(--text-2); margin-block-start: var(--padding-300); } #gc-status { line-height: 1.5; } /* Text content — Prose */ .prose { line-height: 1.6; } .prose > :first-child { margin-block-start: 0; } .prose > :last-child { margin-block-end: 0; } .prose > * { scroll-margin-block-start: calc(45vh - var(--header-height)); } .prose > * + * { margin-block-start: var(--padding-500); } .prose > :is(h1, h2, h3, blockquote) { margin-block: var(--spacing-small); } .prose :is(p, li, blockquote) { max-inline-size: var(--width-constrained); } .prose a:not([class]) { font-weight: 600; text-decoration: underline; } .prose strong > * { font-weight: inherit; } .prose > blockquote { padding: var(--padding-300); border-inline-start: 4px solid var(--accent-dark); background: linear-gradient(90deg, var(--secondary), transparent); } .prose > blockquote > * + * { margin-block-start: var(--padding-500); } .prose > hr { all: unset; display: block; inline-size: 100%; block-size: 1px; background-color: var(--accent-light); margin-block: var(--spacing-small); } /* Images */ .prose > :is(figure, img) { margin-block: var(--spacing-small); } .prose > figure { background-color: var(--secondary); } .prose > figure figcaption { border-block-end: 1px solid var(--accent-light); text-align: center; font-size: 0.875rem; padding: var(--padding-200); } /* Lists */ .prose > ul, .prose > ol { padding-inline-start: var(--padding-500); } .prose > * + ul, .prose > * + ol { margin-block-start: var(--padding-500); } .prose > ul li, .prose > ol li { margin-block-end: var(--padding-500); } .prose > ul li::marker, .prose > ol li::marker { color: var(--text-2); } .prose > ul li :is(ul, ol) { margin-block-start: var(--padding-500); padding-inline-start: var(--padding-300); } /* Post list */ .cards { display: grid; gap: var(--padding-300); grid-template-columns: repeat(2, 1fr); } .card { background-color: var(--primary); border-radius: var(--padding-300); border: 1px solid var(--accent-light); overflow: hidden; } .card-info { padding: var(--padding-300); } .card h3 { font-size: clamp(1.063rem, 0.753rem + 0.62vw, 1.125rem); } .card-info p { margin-block-start: var(--padding-300); font-size: clamp(0.813rem, 0.503rem + 0.62vw, 0.875rem); color: var(--text-2); } /* Homepage latest content */ .latest { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--padding-300); } .latest:not(:last-child) { margin-block-end: var(--spacing-medium); } .latest h2 { font-size: 1.5rem; margin-block-end: var(--padding-500); } /* Opt-out */ /* Share */ .share { background: linear-gradient(var(--secondary), var(--background)); border-block-start: 1px solid var(--accent-light); } .share-inner { padding: var(--spacing-medium) var(--padding-200); } .share-inner > * + * { margin-block-start: var(--padding-500); } .share-inner h2 { font-size: 1.5rem; margin-block-end: var(--padding-500); } /* Footer */ footer { border-block-start: 1px solid var(--accent-light); } .footer-inner { display: flex; inline-size: 100%; justify-content: space-between; padding: var(--spacing-small) var(--padding-200); color: var(--text-2); font-size: 0.875rem; } .footer-text { line-height: 1.5; } .footer-text > * + * { margin-block-start: var(--padding-300); } footer .row { align-self: flex-start; text-align: end; } footer a { color: var(--text-2); } footer a:is(:hover, :focus-visible) { color: var(--text); } /* Mobile */ @media screen and (max-width: 38rem) { .main-navigation .row { display: none; } #menu-button { display: inherit; } .latest { grid-template-columns: 1fr; gap: var(--spacing-medium); } .cards { grid-template-columns: 1fr; } .footer-inner { flex-direction: column; align-items: center; gap: var(--spacing-medium); } .footer-text { text-align: center; } .footer-inner .row { flex-direction: column; align-self: center; } }