@font-face { font-family: "BitBold"; font-style: normal; font-weight: normal; src: local("BitBold"), url("../fonts/BitBold.woff") format("woff"); } :root { --accent: #890b63; --accent-alt: #6b2957; --code-color: #632d55; --text-over-background: #dcdcdc; --fancy-font-stack: BitBold, monospace; --accent-over-background: rgb(62, 249, 138); } @media (prefers-color-scheme: dark) { :root { --accent: rgb(62, 249, 138); --accent-alt: #06cb56; --code-color: #ddfde3; } } .sr-only:not(:focus):not(:active) { clip: rect(0 0 0 0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } html { box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } body > * { grid-column: unset; } body { background-image: url("data:image/svg+xml,"); background-attachment: fixed; font-size: 1.35rem; grid-template-columns: 1fr; justify-items: start; column-gap: 3rem; /* Styles for CRT effect */ margin: 0; min-height: 100vh; /* Text glow */ text-shadow: 2px 2px 0px #000, /* Hard shadow for legibility */ -1px -1px 0 rgba(255,255,255,0.3), /* Slight highlight */ 0 0 8px rgba(255, 255, 255, 0.5), /* Soft bloom */ 0 0 20px rgba(255, 255, 255, 0.3); /* Wide bloom */ } /* Scanline overlay pseudo-element */ body::before { content: " "; display: block; position: fixed; top: 0; left: 0; bottom: 0; right: 0; z-index: 9999; pointer-events: none; background: linear-gradient( to bottom, rgba(0,0,0, 0) 50%, rgba(0,0,0, 0.1) 50% ); background-size: 100% 4px; } /* Rolling refresh rate mismatch bar pseudo-element */ body::after { content: " "; display: block; position: fixed; z-index: 9999; /* 1. STARTING POSITION */ /* Place it vertically above the screen */ top: -10vh; left: 0; right: 0; /* 2. DIMENSIONS */ /* Make it big enough to notice */ height: 10vh; pointer-events: none; /* 3. THE BEAM (Brighter for now: 0.2 opacity) */ background: linear-gradient( to bottom, rgba(255,255,255,0) 0%, rgba(255,255,255,0.03) 50%, /* Visible white line */ rgba(255,255,255,0) 100% ); /* 4. ANIMATION */ will-change: transform; animation: scan-drop 15s linear infinite; } @keyframes scan-drop { 0% { transform: translateY(0); } 25% { transform: translateY(0); } 50% { transform: translateY(150vh); } 100% { transform: translateY(150vh); } } /* Theme scrollbars */ body::-webkit-scrollbar { width: 12px; background: #000; } body::-webkit-scrollbar-thumb { background: var(--accent-alt); border: 1px solid #fff; } body > nav, h1, h2, h3, h4, h5, h6 { font-family: var(--fancy-font-stack); text-shadow: 3px 0px 0px rgba(255, 0, 0, 0.5), -3px 0px 0px rgba(0, 0, 255, 0.5); } img { opacity: 1; max-width: 100%; height: auto; } a { text-decoration: none; transition: 0.2s; } a:visited { color: var(--accent-alt); } a:hover, a:visited:hover { text-shadow: 0 0 2px #fff, 0 0 8px var(--accent); } code { color: var(--code-color); } body > nav { align-self: start; grid-row: 2; position: relative; margin-bottom: 2rem; overflow: auto; } body > nav ul { list-style-type: none; margin: 0; padding: 0; display: flex; } body > nav li { font-size: 2.5rem; margin: 0 1rem; white-space: nowrap; } body > nav li:first-of-type { margin: 0 1rem 0 0; } body > nav a { transition: 0.2s; } body > nav a, body > nav a:visited { text-decoration: none; color: var(--text-over-background); text-shadow: 3px 3px 0 black; } body > nav a[disabled] { cursor: no-drop; } body > nav a:hover:not([disabled]) { color: #fff; } h1 { font-size: 3.5rem; z-index: 1; position: relative; margin-top: 0; text-shadow: 0.1em 0 black; color: var(--text-over-background); } h1 + article { margin-top: -1.9rem; } .logo { max-width: 100%; margin: 2rem 1rem 3rem 2rem; } .logo img { width: 25rem; max-width: 100%; } body > .logo { grid-row: 1; } article { border-radius: 0; } body > article { grid-row: 4; justify-self: stretch; } body > article, body > h1, body > nav, body > .logo { grid-column: 1; } body > h1 { grid-row: 3; } body > h1 { margin: 1rem; } body > nav { padding-left: 1rem; width: 100%; } body > footer { align-self: end; grid-row: 5; border: none; color: var(--text-over-background); margin-top: 2rem; } body > footer a, body > footer a:visited { color: var(--accent-over-background); } footer img { width: 5rem; } @media screen and (min-width: 50rem) { body > h1 { margin-left: 2rem; } body > nav { padding-left: 2rem; } } @media screen and (min-width: 67rem) { body { grid-template-columns: minmax(45rem, 70rem) minmax(18rem, 1fr); } body > nav ul { display: block; } body > nav li { margin: 0; } body > nav { grid-column: 2; grid-row: 3; width: auto; overflow: unset; position: sticky; top: 0; } body > .logo { grid-row: 1; } body > h1 { grid-row: 2; } body > article { grid-row: 3 / 5; margin-bottom: 3rem; } body > footer { align-self: end; grid-column: 2; grid-row: 4; margin-bottom: 3rem; } body > nav a:hover:not([disabled]) { text-shadow: 0 0 5px var(--accent-over-background), 0 0 25px var(--accent-over-background), 0 0 50px var(--accent-over-background), 0 0 100px var(--accent-over-background); } } h1, h2, h3, h4, h5, h6 { display: flex; align-items: baseline; margin-bottom: 0; } h1:hover .anchor, h2:hover .anchor, h3:hover .anchor, h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { display: block; } .anchor { display: none; font-size: 0.6em; opacity: 0.6; color: var(--text); order: 2; text-decoration: none; margin-left: 0.25em; } p:first-of-type { margin-top: 0; } .glow { border: none; box-shadow: 0 0 5px #fff, 0 0 20px 10px var(--accent-over-background); } .bg { position: relative; padding: 1rem; } /* I'm using the Simple.css lightweight CSS framework. This allows me to use the main background color from that framework (the CSS variable `--bg` and use it only behind the article. */ .bg::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: var(--bg); opacity: 0.85; z-index: -1; } @media screen and (min-width: 50rem) { .bg { padding: 2rem; } } .post-list { list-style-type: none; margin: 4rem 0 0; padding: 0; } .post-list li:not(:last-of-type) { margin-bottom: 4rem; } .post-list h2 { margin-bottom: 0.25rem; } .post-list small { display: block; opacity: 0.8; margin-bottom: 0.75rem; } .pagination ol { padding: 0; width: 100%; display: grid; list-style-type: none; grid-template-columns: 1fr 1fr; margin: 4rem 0 0 0; } .pagination .newer-item { grid-column: 1; justify-self: start; } .pagination .older-item { grid-column: 2; justify-self: end; } .webmentions-likes, .webmentions-boosts, .webmentions-replies { list-style-type: none; padding: 0; margin: 0; } .webmentions-replies li { display: flex; align-items: flex-start; } .webmentions-replies li:not(:last-child) { margin-bottom: 1.25rem; } .webmentions-replies li > a, .webmentions-likes li > a, .webmentions-boosts li > a { display: block; position: relative; } .webmentions-likes li > a, .webmentions-boosts li > a { width: 4rem; height: 4rem; } .webmentions-replies li > a { width: 6rem; height: 6rem; margin-right: 1rem; } .webmentions-replies .from-mastodon > a::before, .webmentions-likes .from-mastodon > a::before, .webmentions-boosts .from-mastodon > a::before { content: ""; position: absolute; background: url('/images/mastodon-logo.png') no-repeat center center; background-size: contain; filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.5)); } .webmentions-replies .from-mastodon > a::before { bottom: 0.25rem; left: 0.25rem; width: 1.25rem; height: 1.25rem; } .webmentions-likes .from-mastodon > a::before, .webmentions-boosts .from-mastodon > a::before { bottom: 0.15rem; left: 0.15rem; width: 1rem; height: 1rem; } .webmentions-replies li img { width: 6rem; } .webmentions-replies li .content { flex: 1; } .webmentions-replies li .content .published-datetime { font-size: 0.8em; opacity: 0.8; } .webmentions-replies li .content > a { color: var(--text); } .webmentions-likes, .webmentions-boosts { display: flex; flex-wrap: wrap; gap: 0.5rem; } .webmentions-likes li img, .webmentions-boosts li img { width: 4rem; } .mention-heading { margin-bottom: 1.2rem; } .hidden { display: none; }