Files
website/scripts/og.html
T
2026-08-20 23:08:16 -07:00

255 lines
7.6 KiB
HTML

<!doctype html>
<!--
Source for website/public/og.png (1200x630).
Render with: npm run og (website/)
This card is a portrait of the page it links to, so every value here is lifted
from src/pages/index.astro rather than invented: the --paper ground, the two
diagonal green ambient washes, the grain that keeps them from banding, Public Sans
for the statement, JetBrains Mono for the footer, and the 100deg
#cdead9 -> #2f8f5c signature on "future." Change the site's palette or hero and
this file has to follow, or the card goes stale again.
Legibility rule (enforced by render-og.mjs): a social card is shown as small as
~320px wide (27% scale), so nothing here is smaller than 30px, no line reaches
the 72px padding, and there are no hairlines — a 1px rule scales to a quarter
of a pixel and simply disappears.
-->
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
@font-face {
font-family: 'Public Sans';
src: url('../public/fonts/public-sans.woff2') format('woff2');
font-style: normal;
font-weight: 100 900;
font-display: block;
}
@font-face {
font-family: 'JetBrains Mono';
src: url('../public/fonts/jetbrains-mono.woff2') format('woff2');
font-style: normal;
font-weight: 400 700;
font-display: block;
}
:root {
--ink: #eef3ee;
--secondary: #aebdae;
--muted: #93a494;
--sage: #c6d8c6;
--paper: #0a100c;
}
* {
box-sizing: border-box;
margin: 0;
}
body {
width: 1200px;
height: 630px;
overflow: hidden;
background-color: var(--paper);
color: var(--secondary);
font-family: 'Public Sans', sans-serif;
-webkit-font-smoothing: antialiased;
}
.card {
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
width: 1200px;
height: 630px;
padding: 60px 72px 62px;
isolation: isolate;
}
/* The site's ambient field, held still. Two oversized diagonal bands of green
light crossing at different angles — deliberately not a radial glow: the
circular-blob version of this background was rejected on the site itself. */
.ambient {
position: absolute;
inset: 0;
z-index: -1;
overflow: hidden;
}
.ambient span {
position: absolute;
top: -60%;
left: -60%;
width: 220%;
height: 220%;
}
.ambient .haze {
background: linear-gradient(
106deg,
transparent 31%,
rgb(63 174 116 / 6%) 45%,
rgb(96 186 137 / 2.5%) 53%,
transparent 63%
);
transform: translate3d(-9%, 3%, 0);
}
.ambient .drift {
background: linear-gradient(
-24deg,
transparent 20%,
rgb(120 196 152 / 3%) 43%,
rgb(63 174 116 / 4.5%) 59%,
transparent 79%
);
transform: translate3d(7%, -5%, 0);
}
/* The site's third ambient layer, its feTurbulence grain, is deliberately NOT
reproduced here, and this is the one place the card departs from the page.
The grain is on the site to keep these low-alpha washes from banding, and on
the site it earns that. In a still it does not: scanning background rows of
both renders, the grainless card's gradients are already dithered by the
compositor (longest run of one green value: 1-7px over 420px, i.e. no bands
to break). Measured against the grained render it moves no channel by more
than 5/255 (mean 1.5) — and it costs 364KB, because per-pixel noise is
precisely what PNG cannot compress. An invisible layer is not worth doubling
a file every feed in the world re-fetches. Re-measure before restoring it. */
/* Settles the field back to --paper before it reaches the card's edge, so the
crop reads as an edge rather than as a wash that got cut off. */
.ambient .edge {
top: 0;
left: 0;
width: 100%;
height: 100%;
transform: none;
background: linear-gradient(
to bottom,
var(--paper) 0,
rgb(10 16 12 / 0%) 14%,
rgb(10 16 12 / 0%) 72%,
rgb(10 16 12 / 55%) 90%,
var(--paper) 100%
);
}
/* The masthead lockup, at the site's own proportions: the mark is 2.94x the
brand-name font size and the gap is 0.83em of it. */
.lockup {
display: flex;
align-items: center;
gap: 27px;
}
.lockup img {
display: block;
width: 94px;
height: auto;
flex-shrink: 0;
}
.lockup .brand-name {
color: var(--ink);
font-size: 32px;
font-weight: 600;
letter-spacing: -0.02em;
line-height: 1.05;
}
/* margin-left is the site's optical inset: the S carries a left side bearing,
so the box has to hang 0.05em outside the padding for the printed edge of
the headline to land on it. Per glyph, not per font — re-measure with the
site's value if the first word of the headline changes.
The size is 0.95x the Archivo-era 132px for the same reason the site's clamp
is: Public Sans prints a taller cap at a given font-size. */
.statement {
margin-left: -0.05em;
font-size: 125px;
font-weight: 600;
letter-spacing: -0.03em;
line-height: 0.98;
color: var(--ink);
}
.statement .line {
display: block;
}
/* Line two is locked to line one in em, exactly as on the site, so the
composition holds at whatever size the headline ends up. The card has room
to spare at 1200px; this tracks the site's value so the two compositions
stay the same picture, not because the card needs the slack. */
.statement .line-runs {
margin-left: 2.1em;
}
.statement .that {
color: var(--secondary);
}
.statement .runs {
color: transparent;
background: linear-gradient(100deg, #cdead9 8%, #2f8f5c 82%);
background-clip: text;
-webkit-background-clip: text;
}
.rule {
position: absolute;
left: 72px;
bottom: 132px;
width: 132px;
height: 4px;
border-radius: 2px;
background-image: linear-gradient(100deg, #cdead9, #2f8f5c);
}
.foot {
display: flex;
align-items: baseline;
justify-content: space-between;
font-family: 'JetBrains Mono', monospace;
font-size: 30px;
line-height: 1;
letter-spacing: -0.01em;
color: var(--muted);
}
.foot .site {
color: var(--secondary);
}
</style>
</head>
<body>
<div class="card">
<div class="ambient" aria-hidden="true">
<span class="haze"></span>
<span class="drift"></span>
<span class="edge"></span>
</div>
<div class="lockup">
<img src="../public/blakeslee-icon.svg" alt="" />
<span class="brand-name">Blakeslee<br />Research</span>
</div>
<h1 class="statement">
<span class="line line-research">Solving for</span>
<span class="line line-runs"><span class="that">the</span> <span class="runs">future.</span></span>
</h1>
<div class="rule"></div>
<div class="foot">
<p class="site">blakeslee.xyz</p>
</div>
</div>
</body>
</html>