776 lines
12 KiB
CSS
Executable File
776 lines
12 KiB
CSS
Executable File
: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;
|
|
}
|
|
}
|